<!--控制计划的检测管理要求-->
<template>
  <div style="margin: 0;padding: 0">
    <el-container>
      <!--页面表头设计-->
      <el-header style="height: 7vh">
        <el-link class="headMain" href="http://10.255.96.48:3404/">俄动力质量管理系统</el-link>
         <span class="center-text">频次检测管理</span>
      </el-header>
      <el-container>
        <el-aside width="200px">
          <el-input
              placeholder="输入关键字进行过滤"
              v-model="filterText">
          </el-input>
          <el-tree
              style="margin: 10px 8px;"
              :data="treeTesting"
              :props="defaultProps"
              default-expand-all
              @node-click="treeClick"
              :filter-node-method="filterNode"
              highlight-current="highlight-current"
              ref="tree"></el-tree>
        </el-aside>
        <el-container>
          <!--主题设计-->
          <el-main style="height: 79vh;overflow: auto">
            <div>
              <el-tabs v-model="activeName"
                       @tab-click="handleClick"
                       v-loading="loading"
                       :element-loading-text="waitMessage"
                       element-loading-spinner="el-icon-loading"
                       element-loading-background="rgba(0, 0, 0, 0.8)">
                <el-tab-pane label="检测项目管理" name="first">
                  <el-table
                      :data="tableData"
                      border
                      style="width: 100%" height="68vh">
                    <el-table-column
                        prop="project"
                        label="检验项目"
                        width="180"
                        v-slot:default="scope">
                      <span v-if="languageS==='chinese'">{{scope.row.project}}</span>
                      <span v-if="languageS==='english'">{{scope.row.projectEnglish}}</span>
                      <span v-if="languageS==='russian'">{{scope.row.projectRussian}}</span>
                    </el-table-column>
                    <el-table-column
                        prop="requirement"
                        label="检验要求"
                        width="180">
                    </el-table-column>
                    <el-table-column
                        label="检测类型" v-slot:default="typeTesting">
                      <el-link v-if="languageS==='chinese'">{{typeTesting.row.typeTesting.split('/')[0]}}</el-link>
                      <el-link v-if="languageS==='english'">{{typeTesting.row.typeTesting.split('/')[1]}}</el-link>
                      <el-link v-if="languageS==='russian'">{{typeTesting.row.typeTesting.split('/')[2]}}</el-link>
                    </el-table-column>
                    <el-table-column
                        prop="standard"
                        label="标准值">
                    </el-table-column>
                    <el-table-column
                        prop="ceiling"
                        label="上公差">
                    </el-table-column>
                    <el-table-column
                        prop="lower"
                        label="下公差">
                    </el-table-column>
                    <el-table-column
                        prop="frequency"
                        label="检验频次">
                    </el-table-column>
                    <el-table-column
                        v-slot:default="department"
                        label="实施部门">
                      <el-link v-if="languageS==='chinese'">{{department.row.department.split('/')[0]}}</el-link>
                      <el-link v-if="languageS==='english'">{{department.row.department.split('/')[1]}}</el-link>
                      <el-link v-if="languageS==='russian'">{{department.row.department.split('/')[2]}}</el-link>
                    </el-table-column>
                    <el-table-column
                        prop="projectType"
                        label="项目类型">
                    </el-table-column>
                    <el-table-column
                        prop="controlTesting"
                        label="ID">
                    </el-table-column>
                  </el-table>
                </el-tab-pane>
                <el-tab-pane label="检测数据录入" name="second"
                    v-if="usePower===1 || usePower===2">
                  <div class="container">
                    <div>
                      <span>发动机号/零部件号：</span>&nbsp;&nbsp;
                      <el-input style="width: 120px" v-model="workpieceInput" @change="workpieceChang"></el-input>&nbsp;&nbsp;
                      <span>检测日期：</span>&nbsp;&nbsp;
                      <template class="block">
                        <el-date-picker
                            v-model="valueDate"
                            align="right"
                            type="date"
                            format="yyyy - MM - dd "
                            placeholder="选择日期"
                            :picker-options="pickerOptions"
                            @change="dateChange">
                        </el-date-picker>
                      </template>&nbsp;&nbsp;
                      <span>班次：</span>
                      <el-select
                          v-model="classes" placeholder="请选择"
                          size="small"
                          style="width: 70px">
                        <el-option
                            v-for="item in classesOptions"
                            :key="item.value"
                            :label="item.label"
                            :value="item.value">
                        </el-option>
                      </el-select>
                      <span style="margin-left: 10px">检验员工号:</span>&nbsp;&nbsp;
                    </div>
                    <div>
                      <el-button @click="valueDateSave">保存</el-button>
                    </div>

                  </div>
                  <el-table
                      :data="tableDataValueUse"
                      border
                      style="width: 100%;margin-top: 10px" height="61vh">
                    <el-table-column
                        :prop="project"
                        label="检验项目">
                    </el-table-column>
                    <el-table-column
                        :prop="requirement"
                        label="检验要求">
                    </el-table-column>
                    <el-table-column
                        label="工件号"
                        prop="workpiece"
                        width="140"
                        v-slot:default="scope">
                      <el-input v-model="tableDataValueUse[scope.$index].workpiece"></el-input>
                    </el-table-column>
                    <el-table-column
                        prop="frequency"
                        label="检验频次"
                        width="80">
                    </el-table-column>
                    <el-table-column
                        v-slot:default="department"
                        label="实施部门"
                        width="120">
                      <el-link v-if="languageS==='chinese'">{{department.row.department.split('/')[0]}}</el-link>
                      <el-link v-if="languageS==='english'">{{department.row.department.split('/')[1]}}</el-link>
                      <el-link v-if="languageS==='russian'">{{department.row.department.split('/')[2]}}</el-link>
                    </el-table-column>
                    <el-table-column
                      label="班次"
                      prop="classes"
                      width="80">
                    </el-table-column>
                    <el-table-column
                        label="实测值"
                        width="100"
                        v-slot:default="scope">
                      <el-input v-model="tableDataValueUse[scope.$index].valueUse"
                                @input="handleBlur($event,scope.$index)"></el-input>
                    </el-table-column>
                    <el-table-column
                        label="判定"
                        width="80"
                        v-slot:default="scope">
                      <el-button type="danger" :style="getButtonStyle(scope.$index)" circle>{{tableDataValueUse[scope.$index].passUse}}</el-button>
                    </el-table-column>
                  </el-table>
                </el-tab-pane>
                <el-tab-pane label="作业指导书" name="Seventh">
                  <div style="display: flex;height: 68vh;margin-top: 10px">
                    <div style="width: 220px; border: 1px solid blue; box-sizing: border-box;">
                      <div style="margin-top: 10px;text-align: center;overflow: auto">
                        <span style=" color: red;font-size: 18px">表单信息</span>
                        <hr>
                        <div>
                          <el-table
                              :data="tableDataValueUse"
                              border
                              style="margin-top: 10px" height="60vh">
                            <el-table-column
                                :prop="project"
                                label="检验项目"
                                width="400px"
                                v-slot:default="scope">
                              <div @click="labelDataWorkBookRowClick(scope)">{{scope.row.project}}</div>
                            </el-table-column>
                          </el-table>
                        </div>
                      </div>
                    </div>
                    <div style="flex-grow: 1;
                  border: 1px solid blue;
                  box-sizing: border-box;
                  margin-left: 8px;
                  padding: 8px;
                  display: flex;
                  width: 100%">
                      <div style="flex: 1;height: 65vh;scroll-margin-right: 8px;overflow-x: auto">
                        <div style="text-align: left;">
                          <el-link :style="{marginRight:'5px',backgroundColor:workBookHeard1 , color:workBookHeardColour1, padding: '4px 10px', borderRadius: '5px' }" @click="workBookHeard(1)">要领书/指导书</el-link>
                          <span>|</span>
                          <el-link :style="{marginRight:'5px',backgroundColor:workBookHeard2 , color:workBookHeardColour2, padding: '4px 10px', borderRadius: '5px' }" @click="workBookHeard(2)">控制计划</el-link>
                          <span>|</span>
                          <el-link :style="{marginRight:'5px',backgroundColor:workBookHeard3 , color:workBookHeardColour3, padding: '4px 10px', borderRadius: '5px' }" @click="workBookHeard(3)">学习记录</el-link>
                          <span>|</span>
                          <el-link :style="{marginRight:'5px',backgroundColor:workBookHeard4 , color:workBookHeardColour4, padding: '4px 10px', borderRadius: '5px' }" @click="workBookHeard(4)">工时</el-link>
                        </div>
                        <hr>
                        <div v-if="workBookHeardUse===1">
                          <el-table
                              :data="workBook"
                              border
                              style="width: 100%;margin-top: 5px"
                              height="66vh">
                            <el-table-column
                                type="expand"
                                v-slot:default="props">
                              <div>
                                <div style="margin-right: 10px;margin-left: 15px;margin-bottom:8px;border: 1px solid blue;padding: 5px">
                                  <span>注意点说明：</span>
                                  <span v-if="languageS==='chinese' && props.row.problem.split('|*|').length===3">{{props.row.problem.split('|*|')[0]}}</span>
                                  <span v-else-if="languageS==='english' && props.row.problem.split('|*|').length===3">{{props.row.problem.split('|*|')[1]}}</span>
                                  <span v-else-if="languageS==='russian' && props.row.problem.split('|*|').length===3">{{props.row.problem.split('|*|')[2]}}</span>
                                  <span v-else>{{props.row.problem}}</span>
                                </div>
                                <div style="margin-right: 10px;margin-left: 15px;margin-bottom:8px;border: 1px solid blue;padding: 5px">
                                  <span>品质检查：</span>
                                  <span v-if="languageS==='chinese' && props.row.inspect.split('|*|').length===3">{{props.row.inspect.split('|*|')[0]}}</span>
                                  <span v-else-if="languageS==='english' && props.row.inspect.split('|*|').length===3">{{props.row.inspect.split('|*|')[1]}}</span>
                                  <span v-else-if="languageS==='russian' && props.row.inspect.split('|*|').length===3">{{props.row.inspect.split('|*|')[2]}}</span>
                                  <span v-else>{{props.row.inspect}}</span>
                                </div>
                                <div style="margin-right: 10px;margin-left: 15px;margin-bottom:8px;border: 1px solid blue;padding: 5px">
                                  <span>工具：</span>
                                  <span v-if="languageS==='chinese' && props.row.toll.split('|*|').length===3">{{props.row.toll.split('|*|')[0]}}</span>
                                  <span v-else-if="languageS==='english' && props.row.toll.split('|*|').length===3">{{props.row.toll.split('|*|')[1]}}</span>
                                  <span v-else-if="languageS==='russian' && props.row.toll.split('|*|').length===3">{{props.row.toll.split('|*|')[2]}}</span>
                                  <span v-else>{{props.row.toll}}</span>
                                </div>
                                <div style="margin-right: 10px;margin-left: 15px;margin-bottom:8px;border: 1px solid blue;padding: 5px">
                                  <span>设备：</span>
                                  <span v-if="languageS==='chinese' && props.row.device.split('|*|').length===3">{{props.row.device.split('|*|')[0]}}</span>
                                  <span v-else-if="languageS==='english' && props.row.device.split('|*|').length===3">{{props.row.device.split('|*|')[1]}}</span>
                                  <span v-else-if="languageS==='russian' && props.row.device.split('|*|').length===3">{{props.row.device.split('|*|')[2]}}</span>
                                  <span v-else>{{props.row.device}}</span>
                                </div>
                                <div style="margin-right: 10px;margin-left: 15px;margin-bottom:8px;border: 1px solid blue;padding: 5px">
                                  <span>辅料：</span>
                                  <span v-if="languageS==='chinese' && props.row.accessories.split('|*|').length===3">{{props.row.accessories.split('|*|')[0]}}</span>
                                  <span v-else-if="languageS==='english' && props.row.accessories.split('|*|').length===3">{{props.row.accessories.split('|*|')[1]}}</span>
                                  <span v-else-if="languageS==='russian' && props.row.accessories.split('|*|').length===3">{{props.row.accessories.split('|*|')[2]}}</span>
                                  <span v-else>{{props.row.accessories}}</span>
                                </div>
                              </div>
                            </el-table-column>
                            <el-table-column
                                v-slot:default="scope"
                                label="序号"
                                width="50">
                              {{scope.$index+1}}
                              <el-link @click="editBook(2,scope)"><i class="el-icon-download"></i></el-link>
                            </el-table-column>
                            <el-table-column
                                prop="work"
                                label="步骤内容"
                                v-slot:default="scope">
                              <div>
                                <span @click="editBook(100,scope)" v-if="languageS==='chinese' && scope.row.work.split('|*|').length===3">{{scope.row.work.split('|*|')[0]}}</span>
                                <span @click="editBook(100,scope)" v-else-if="languageS==='english' && scope.row.work.split('|*|').length===3">{{scope.row.work.split('|*|')[1]}}</span>
                                <span @click="editBook(100,scope)" v-else-if="languageS==='russian' && scope.row.work.split('|*|').length===3">{{scope.row.work.split('|*|')[2]}}</span>
                                <span @click="editBook(100,scope)" v-else>{{scope.row.work}}</span>
                                <span @click="editBook(100,scope)">--{{scope.row.spendTime}}S</span>
                                <el-link style="margin-left: 20px" @click="editBook(1,scope)"><i class="el-icon-edit"></i></el-link>
                                <el-link style="margin-left: 10px" @click="editBook(4,scope)"><i class="el-icon-picture-outline"></i></el-link>
                                <el-link style="margin-left: 10px" @click="editBook(5,scope)"><i class="el-icon-video-camera"></i></el-link>
                                <el-link style="margin-left: 10px" @click="editBook(3,scope)"><i class="el-icon-delete"></i></el-link>
                              </div>
                            </el-table-column>
                          </el-table>
                        </div>
                        <div v-if="workBookHeardUse===2">
                          开发中
                        </div>
                        <div v-if="workBookHeardUse===3">开发中</div>
                        <div v-if="workBookHeardUse===4">开发中</div>
                      </div>
                      <div style="flex: 1;">
                        <el-card shadow="hover" style="height: 65vh;margin-left: 8px">
                          <div style="width: 100%;height: 62vh;margin-top: -8px;text-align: left;">
                            <el-link :style="{ backgroundColor:videoAndImage1 , color:videoAndImageColor1 , padding: '4px 10px', borderRadius: '5px' }" @click="videoAndImage(1)">图片</el-link>
                            <span style="margin-left: 8px;margin-right: 8px">|</span>
                            <el-link :style="{ backgroundColor:videoAndImage2 , color:videoAndImageColor2 , padding: '4px 10px', borderRadius: '5px' }" @click="videoAndImage(2)">视频</el-link>
                            <hr>
                            <div class="block">
                              <el-carousel trigger="click" height="62vh" v-if="editVideoAndImageUse===1">
                                <el-carousel-item v-for="(item, index) in itemView" :key="index">
                                  <el-image
                                      style="width: 100%; height: 100%"
                                      :src="item"
                                      fit='contain'
                                      @click="handleImageClick(item)">
                                  </el-image>
                                </el-carousel-item>
                              </el-carousel>
                              <el-carousel trigger="click" height="62vh" :autoplay="false" v-if="editVideoAndImageUse===2">
                                <el-carousel-item v-for="(item, index) in itemViewVideo" :key="index">
                                  <video
                                      style="width: 100%; height: 100%"
                                      :src="item"
                                      controls></video>
                                </el-carousel-item>
                              </el-carousel>
                            </div>
                          </div>
                        </el-card>
                      </div>
                    </div>
                  </div>
                </el-tab-pane>
                <el-tab-pane label="趋势管理" name="third">
                    <div style="display: flex;margin-left: 10px;margin-right: 10px;margin-top:10px;height:33vh;overflow: auto">
                      <div style="flex: 1;  border: 1px solid blue; margin-right: 10px">
                        <!--放置图表区域-->
                        <div ref="myChart" style="width: 100%;height: 100%"></div>
                      </div>
                      <div style=" border: 1px solid blue; width: 130px; margin-right: 10px">
                        <el-button type="info" plain style="width: 110px;margin-top: 5px;margin-left: 1px;" :style="buttonAll" @click="chart('all')">所有数据</el-button>
                        <el-button type="info" plain style="width: 110px;margin-top: 5px;margin-left: 1px" :style="button500" @click="chart(500)">500组数据</el-button>
                        <el-button type="info" plain style="width: 110px;margin-top: 5px;margin-left: 1px" :style="button300" @click="chart(300)">300组数据</el-button>
                        <el-button type="info" plain style="width: 110px;margin-top: 5px;margin-left: 1px" :style="button125" @click="chart(125)">125组数据</el-button>
                        <el-button type="info" plain style="width: 110px;margin-top: 5px;margin-left: 1px" :style="button25" @click="chart(25)">25组数据</el-button>
                      </div>
                    </div>
                    <div style="display: flex;margin-left: 10px;margin-right: 10px;margin-top:10px;height:33vh;overflow: auto">
                      <div style="flex: 1;  border: 1px solid blue; margin-right: 10px">
                        直方图
                        <div ref="myChartBor" style="height: 29vh;width:25vw"></div>
                      </div>
                      <div style="flex: 1;  border: 1px solid blue; margin-right: 10px">
                        移动极差
                        <div ref="myChartLine" style="height: 29vh;width:25vw"></div>
                      </div>
                      <div style=" border: 1px solid blue; width: 300px; margin-right: 10px;overflow: auto">
                        过程能力
                        <div style="margin-top: 10px;text-align: left">CPK:{{cpk}}</div>
                        <div style="margin-top: 10px;text-align: left">判异结果：</div>
                        <div style="margin-top: 10px;text-align: left">
                          <el-link>连续六点上升：</el-link>
                          <el-link v-if="riseSix.length===0">无异常,请保持</el-link>
                          <el-link v-else>有异常，请立即解决</el-link>
                        </div>
                        <div style="margin-top: 10px;text-align: left">
                          <el-link>连续六点下降：</el-link>
                          <el-link v-if="riseSix.length===0">无异常,请保持</el-link>
                          <el-link v-else>有异常，请立即解决</el-link>
                        </div>
                      </div>
                      <div style=" border: 1px solid blue; width: 300px; margin-right: 10px;overflow: auto">
                        <el-table
                            :data="tableDataValueUse"
                            border
                            style="width: 100%;margin-top: 10px" height="28vh"
                            @row-click="projectHandleRowClick">
                          <el-table-column
                              :prop="project"
                              label="检验项目">
                          </el-table-column>
                        </el-table>
                      </div>
                    </div>
                </el-tab-pane>
                <el-tab-pane label="管理中台" name="fourth">
                  <div style="display: flex;justify-content: space-between;margin: 10px">
                    <el-card style="flex: 1;margin-right: 10px;margin-left: 10px;height: 200px">
                      <div slot="header" style="display: table;content: '';">
                        <span style="float: left">生产信息：</span>
                        <el-link @click="assProductionClick">产量维护</el-link>
                      </div>
                      <div style="text-align: left; height: 100px; overflow-y: auto;">
                        <div>
                          <span style="margin-right: 10px">选择日期：</span>
                          <el-date-picker
                              style="width: 130px"
                              v-model="value1"
                              type="date"
                              size="small"
                              format="yyyy-MM-dd"
                              value-format="yyyy-MM-dd"
                              placeholder="选择日期"
                              @change="handleDateChange">
                          </el-date-picker>
                        </div>
                        <div style="margin-top: 5px">
                          <span style="margin-right: 10px">选择班次：</span>
                          <el-select
                              v-model="classes" placeholder="请选择"
                              size="small"
                              style="width: 130px">
                            <el-option
                                v-for="item in classesOptions"
                                :key="item.value"
                                :label="item.label"
                                :value="item.value">
                            </el-option>
                          </el-select>
                        </div>
                        <div style="margin-top: 5px">
                          <span>EB05：</span><span style="margin-right: 5px">{{assProductionShow.assEb05}}</span><el-divider direction="vertical"></el-divider>
                          <span style="margin-left: 5px">EB35：</span><span>{{assProductionShow.assEb35}}</span>
                        </div>
                        <div style="margin-bottom: 5px">
                          <span>EN19：</span><span style="margin-right: 5px">{{assProductionShow.assEn19}}</span><el-divider direction="vertical"></el-divider>
                          <span style="margin-left: 5px">EN38：</span><span>{{assProductionShow.assEn38}}</span>
                        </div>
                      </div>
                    </el-card>
                    <el-card style="flex: 1;margin-right: 10px;margin-left: 10px;height: 200px">
                      <div slot="header" style="content: '';display: flex; justify-content: space-between; padding: 0 5px;">
                        <div style="flex: 1;  box-sizing: border-box; margin-right: 10px;text-align: left">
                          <span>当日完成情况：</span>
                          <span>{{value1}}</span>
                          <el-link style="margin-left: 10px" @click="alreadyCompleted"><i class="el-icon-refresh-right"></i></el-link>
                        </div>
                      </div>
                      <div style="margin-top: 8px;text-align: left">
                        EB05需要检测数量：{{everyDayTestEB05.num}}项
                      </div>
                      <div style="margin-top: 8px;text-align: left; color: #0269fa">
                        EB05当日已完成数量：{{everyDayTestEB05.actual}}项
                      </div>
                      <div style="margin-top: 8px;text-align: left; color: red">
                        EB05当日未完成数量：{{everyDayTestEB05.num-everyDayTestEB05.actual}}项
                      </div>
                    </el-card>
                    <el-card style="flex: 1;margin-right: 10px;margin-left: 10px;height: 200px">
                      <div slot="header" style="display: table;content: '';">
                        <span style="float: left">目前检测合格情况：</span>
                      </div>
                      <div style="margin-top: 8px;text-align: left">
                        当日已完成{{everyDayTestEB05.actual}}项：
                      </div>
                      <div style="margin-top: 8px;text-align: left; color: #0269fa">
                        合格{{passNumber}}项，{{(passNumber/finishNumber*100).toFixed(1)}}%；
                      </div>
                      <div style="margin-top: 8px;text-align: left; color: red">
                        不合格{{noPassNumber}}项，{{noPassNumber/finishNumber}}%；
                      </div>
                    </el-card>
                    <el-card style="flex: 1;margin-right: 10px;margin-left: 10px;height: 200px">
                      <div slot="header" style="display: table;content: '';">
                        <span>综合趋势变化：</span>
                        <el-link style="margin-left: 5px" @click="ppkMonthCount">月</el-link>
                      </div>
                      <div style="text-align: left">
                        <span>
                          EB05PPK计算日期：
                        </span>
                        <el-link @click="assTestLogRefreshPPKDate('EB05PPK','M')">
                          <span>{{EB05PPKDateM}}</span>
                        </el-link>
                      </div>
                      <div style="text-align: left;margin-top: 8px">
                        当期共有{{EB05PPKDate133}}项PPK＜1.33；
                        <el-link @click="comprehensiveShow(2)"><i class="el-icon-document"></i></el-link>
                      </div>
                      <div style="text-align: left;margin-top: 8px;color: red">
                        预判过程能力变差项：{{capacityBad}}
                      </div>
                      <div style="text-align: left;margin-top: 8px;color: #0269fa">
                        预判过程能力变好项：{{capacityGood}}
                      </div>
                    </el-card>
                  </div>
                  <div style="margin: 10px">
                    <el-card style="flex: 1;margin-right: 10px;margin-left: 10px;height: 36vh">
                      <div slot="header" style="display: table;content: '';">
                        <span style="float: left">管理模型建议：</span>
                        <el-link>更新数据</el-link>
                      </div>
                      <div style="margin-top: 8px;text-align: left">
                        {{suggestAi[0]}}
                      </div>
                      <div style="margin-top: 8px;text-align: left">
                        {{suggestAi[1]}}
                      </div>
                      <div style="margin-top: 8px;text-align: left">
                        {{suggestAi[2]}}
                      </div>
                      <div style="margin-top: 8px;text-align: left">
                        {{suggestAi[3]}}
                      </div>
                    </el-card>
                  </div>

                </el-tab-pane>
                <el-tab-pane label="数据管理" name="fifth"
                  v-if="usePower===1">
                  <el-table
                      :data="tableDataValueEdit"
                      border
                      style="width: 100%" height="68vh">
                    <el-table-column
                        :prop="project"
                        label="检验项目"
                        width="180">
                    </el-table-column>
                    <el-table-column
                        :prop="requirement"
                        label="检验要求"
                        width="180">
                    </el-table-column>
                    <el-table-column
                        prop="standard"
                        label="标准值"
                        width="70px">
                    </el-table-column>
                    <el-table-column
                        prop="ceiling"
                        label="上公差"
                        width="70px"
                        v-slot:default="scope">
                      {{scope.row.ceiling}}
                      <el-link style="text-align: right">
                        <i class="el-icon-edit" @click="testingEdit(scope,5)"></i>
                      </el-link>
                    </el-table-column>
                    <el-table-column
                        prop="lower"
                        label="下公差"
                        width="70px"
                        v-slot:default="scope">
                      {{scope.row.lower}}
                      <el-link style="text-align: right">
                        <i class="el-icon-edit" @click="testingEdit(scope,4)"></i>
                      </el-link>
                    </el-table-column>
                    <el-table-column
                        prop="testingDate"
                        label="检测日期"
                        v-slot:default="scope">
                      {{scope.row.testingDate}}
                      <el-link style="text-align: right">
                        <i class="el-icon-edit" @click="testingEdit(scope,1)"></i>
                      </el-link>
                    </el-table-column>
                    <el-table-column
                        prop="workpiece"
                        label="工件号"
                        v-slot:default="scope">
                      {{scope.row.workpiece}}
                      <el-link style="text-align: right">
                        <i class="el-icon-edit" @click="testingEdit(scope,2)"></i>
                      </el-link>
                    </el-table-column>
                    <el-table-column
                        prop="userId"
                        label="检测人员">
                    </el-table-column>
                    <el-table-column
                        prop="valueUse"
                        label="实测值"
                        v-slot:default="scope">
                      {{scope.row.valueUse}}
                      <el-link style="text-align: right">
                        <i class="el-icon-edit" @click="testingEdit(scope,3)"></i>
                      </el-link>
                    </el-table-column>
                  </el-table>
                </el-tab-pane>
                <el-tab-pane label="模型说明" name="sixth">
                  <div style="display: flex; justify-content: space-between; padding: 0 5px;">
                    <div style="flex: 1;  box-sizing: border-box; margin-right: 10px;">
                      <div style="height: 18vh;border: 1px solid blue; margin-bottom: 10px;text-align: left;overflow: auto">
                        <hr>
                        <strong style="color: red">模型目的：</strong><hr>
                        <span style="line-height: 30px;">
                          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过建立过程特性与产品特性数学关系，过程特性的变化后，预知产品特性的变化，提前调整保证产品特性一致,形成AI质量机器人，梳理异常并提示，同时实现错、漏检监控、自动跟踪问题进行闭环。
                        </span>
                      </div>
                      <div style="height: 49vh;border: 1px solid blue;text-align: left;overflow: auto">
                        <hr>
                        <strong style="color: red">管理思考：</strong>
                        <hr>
                        <h4>相邻两个批次产品特性管理思考:</h4>

                        <p style="line-height: 30px;">
                          <strong>在日常检测手段的有效性评估：</strong><br>
                          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于当前使用的日常检测手段，应进行全面评估。这包括检测方法的精确度、灵敏度、稳定性以及覆盖范围。如果检测手段仅聚焦于产品特性的平均值或某几个关键点，而未能全面捕捉特性的波动趋势，那么它可能无法及时暴露出相邻批次特性向上限偏移的异常。因此，提升检测手段的精细化水平，引入更先进的统计过程控制（SPC）技术，如控制图（如X-bar图、R图）、过程能力分析（Cpk）等，将有助于提高异常识别的准确性和及时性。
                        </p>

                        <p style="line-height: 30px;">
                          <strong>异常识别的时效性：</strong><br>
                          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;需要建立快速响应的监控机制。这包括但不限于实时数据采集系统、自动化检测设备和智能预警系统。通过实时监控生产过程中的各项关键参数，结合大数据分析技术，可以实现对产品特性变化的即时预警，从而在本批次生产结束前就能采取措施进行纠正，避免问题产品流入市场。
                        </p>

                        <p style="line-height: 30px;">
                          <strong>下批次产品特性的潜在变化预测：</strong><br>
                          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;运用预测模型（如时间序列分析、机器学习算法等）来预测下批次产品特性的变化趋势。这种预测不仅能帮助企业提前做好调整准备，还能为生产计划的制定提供重要参考。同时，加强供应链管理和原材料质量控制，确保输入稳定，也是减少下批次产品特性波动的重要手段。
                        </p>

                      </div>
                    </div>
                    <div style="flex: 1; box-sizing: border-box;">
                      <div style="height: 49vh;border: 1px solid blue; margin-bottom: 10px;text-align: left;overflow: auto">
                        <hr>
                        <strong style="color: red">开展说明：</strong>
                        <hr>
                        <div >
                          <p style="line-height: 30px;">
                            <strong>数据趋势类监控管理：</strong><br>
                            &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;模型依据支撑：过程的不稳定性将体现在最终产品数据中，设备类、工装类、变化点的影响，将产生在最终产品上，因此对产品数据趋势的分析，将让变化点显现出来；<br>
                            <strong>模型设置条件：</strong><br>
                            &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;1.按照每15天对过程能力进行一次核算，识别过程能力持续下降项目，分析是否有设备、工装等持续磨损现象；<br>
                            &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;2.对连续6点的趋势性变化进行统计，剖析形成趋势变化的真因，并利用；<br>
                            &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;3.每日将数据进行运算，得到当日应该检测项目数量，防止漏检、错检；<br>
                          </p>
                        </div>
                      </div>
                      <div style="height: 18vh;border: 1px solid blue;text-align: left;overflow: auto">
                        <hr>
                        <strong style="color: red">模型公式：</strong>
                        <hr>
                        <el-link style="margin-right: 10px;margin-left: 10px">连续六点上升、下降</el-link><span>|</span>
                        <el-link style="margin-right: 10px;margin-left: 10px">趋势图中CPK值</el-link><span>|</span>
                        <el-link style="margin-right: 10px;margin-left: 10px">管理中台中的CPK值</el-link><span>|</span>
                      </div>
                    </div>
                  </div>
                </el-tab-pane>
              </el-tabs>

            </div>
          </el-main>
          <el-footer>
            <el-button plain size="small" @click="languageSelectChinese">中  文</el-button>
            <el-button plain size="small" @click="languageSelectRussian">Русский язык</el-button>
            <el-button plain size="small" @click="languageSelectEnglish">English</el-button>
          </el-footer>
        </el-container>
      </el-container>
    </el-container>

    <!--弹窗放置区-->
        <!--“列表编辑”弹窗-->
    <el-dialog
        :title="titleMessage"
        :visible.sync="dialogVisibleTesting"
        width="30%"
        :before-close="handleClose">
      <div>
        <el-form ref="tableDataTemp" :model="tableDataTemp" status-icon :rules="rules"  label-width="90px" :inline="true">
          <div class="UploadS">
            <el-form-item label="检测项目" class="item" prop="project">
              <el-input v-model="tableDataTemp.project" placeholder="检测项目" style="width: 120%" :disabled="doe===2"></el-input>
            </el-form-item>
            <el-form-item label="English" class="item" prop="projectEnglish">
              <el-input  v-model="tableDataTemp.projectEnglish" placeholder="检测项目" style="width: 120%" :disabled="doe===2"></el-input>
            </el-form-item>
            <el-form-item label="Russian" class="item" prop="projectRussian">
              <el-input  v-model="tableDataTemp.projectRussian" placeholder="检测项目" style="width: 120%" :disabled="doe===2"></el-input>
            </el-form-item>
          </div>

          <div class="UploadS">
            <el-form-item label="检测要求" class="item" prop="requirement">
              <el-input v-model="tableDataTemp.requirement" placeholder="检测项目" style="width: 120%" :disabled="doe===2"></el-input>
            </el-form-item>
            <el-form-item label="English" class="item" prop="requirementEnglish">
              <el-input  v-model="tableDataTemp.requirementEnglish" placeholder="检测项目" style="width: 120%" :disabled="doe===2"></el-input>
            </el-form-item>
            <el-form-item label="Russian" class="item" prop="requirementRussian">
              <el-input  v-model="tableDataTemp.requirementRussian" placeholder="检测项目" style="width: 120%" :disabled="doe===2"></el-input>
            </el-form-item>
          </div>

          <div class="UploadS">
            <el-form-item label="检测类型" class="item">
              <el-select v-model="tableDataTemp.typeTesting" placeholder="请选择" :disabled="doe===2">
                <el-option
                    v-for="item in options"
                    :key="item.value"
                    :label="item.label"
                    :value="item.value">
                </el-option>
              </el-select>
            </el-form-item>
            <el-form-item label="标准值" prop="standard" class="item">
              <el-input v-model="tableDataTemp.standard" placeholder="请输入标准值" :disabled="tableDataTemp.typeTesting==='目视/visual/Визуальное зрение' || tableDataTemp.typeTesting==='计数/count/Количество'||doe===2 || tableDataTemp.typeTesting===''"></el-input>
            </el-form-item>
            <el-form-item label="上偏差" prop="ceiling" class="item">
              <el-input v-model="tableDataTemp.ceiling" placeholder="请输入上偏差" :disabled="tableDataTemp.typeTesting==='目视/visual/Визуальное зрение' || tableDataTemp.typeTesting==='计数/count/Количество'||doe===2 || tableDataTemp.typeTesting===''"></el-input>
            </el-form-item>
            <el-form-item label="下偏差" prop="lower" class="item">
              <el-input v-model="tableDataTemp.lower" placeholder="请输入下偏差" :disabled="tableData.typeTesting==='目视/visual/Визуальное зрение' || tableData.typeTesting==='计数/count/Количество'||doe===2"></el-input>
            </el-form-item>
          </div>

          <div class="UploadS">
            <el-form-item label="检验频次%" prop="frequency" class="item">
              <el-input-number  v-model="tableDataTemp.frequency" :disabled="doe===2"></el-input-number><span>%</span>
            </el-form-item>
            <el-form-item label="责任部门" prop="department" class="item">
              <el-select v-model="tableDataTemp.department" placeholder="请选择" :disabled="doe===2">
                <el-option
                    v-for="item in optionsD"
                    :key="item.value"
                    :label="item.label"
                    :value="item.value">
                </el-option>
              </el-select>
            </el-form-item>
          </div>
          <br><br>
          <el-form-item>
            <el-button type="primary" @click="submitForm('tableDataTemp')">提交</el-button>
            <el-button @click="resetForm('tableData')" :disabled="doe===2">重置</el-button>
          </el-form-item>
        </el-form>
      </div>
    </el-dialog>
    <!--单击数据编辑区的弹窗，需要一个输入文本日期的地方-->
    <el-dialog
        :title="titleUse"
        :visible.sync="dialogVisibleDate"
        width="30%"
        :before-close="handleClose">
      <el-date-picker
          v-model="valueDate"
          type="date"
          placeholder="选择日期">
      </el-date-picker>
      <span slot="footer" class="dialog-footer">
    <el-button @click="dialogVisibleDate = false">取 消</el-button>
    <el-button type="primary" @click="saveTestingEdit">确 定</el-button>
  </span>
    </el-dialog>
    <!--单击数据编辑区的弹窗，需要一个输入文本地方-->
    <el-dialog
        :title="titleUse"
        :visible.sync="dialogVisibleName"
        width="30%"
        :before-close="handleClose">
      <el-input placeholder="请输入内容" v-model="inputName" style="width: 100%"></el-input>
      <span slot="footer" class="dialog-footer">
    <el-button @click="dialogVisibleName = false">取 消</el-button>
    <el-button type="primary" @click="saveTestingEdit">确 定</el-button>
  </span>
    </el-dialog>
    <!--输入多个文本的弹窗类型，用在作业指导书编辑上-->
    <el-dialog
        :title="titleUse"
        :visible.sync="dialogVisibleText"
        width="50%"
        :before-close="handleClose">
      <div style="text-align: left">
        <div style="overflow: hidden;">
          <div style="float: left; width: 45%; text-align: left;">
            <span style="font-size: 18px;color: red">操作步骤：</span>
          </div>
          <div style="float: right; width: 45%; text-align: right;">
            <span>工步用时(单位S）</span><el-input-number v-model="inputNum" :min="0" :max="200"></el-input-number>
          </div>
        </div>
        <el-input placeholder="请输入内容"
                  v-model="inputText1"
                  style="width: 100%;margin-top: 8px"
                  type="textarea"
                  :rows="3"></el-input>
      </div>
      <div style="margin-top: 10px;text-align: left">
        <span style="font-size: 18px">关注点：</span>
        <el-input placeholder="请输入内容"
                  v-model="inputText2"
                  style="width: 100%;margin-top: 8px"
                  type="textarea"
                  :rows="3"></el-input>
      </div>
      <div style="margin-top: 10px;text-align: left">
        <span style="font-size: 18px">品质检查：</span>
        <el-input placeholder="请输入内容"
                  v-model="inputText3"
                  style="width: 100%;margin-top: 8px"
                  type="textarea"
                  :rows="3"></el-input>
      </div>
      <div style="margin-top: 10px;text-align: left">
        <span style="font-size: 18px">设备名称：</span>
        <el-input placeholder="请输入内容"
                  v-model="inputText4"
                  style="width: 100%;margin-top: 8px"
                  type="textarea"
                  :rows="2"></el-input>
      </div>
      <div style="margin-top: 10px;text-align: left">
        <span style="font-size: 18px">辅料名称：</span>
        <el-input placeholder="请输入内容"
                  v-model="inputText5"
                  style="width: 100%;margin-top: 8px"
                  type="textarea"
                  :rows="2"></el-input>
      </div>
      <div style="margin-top: 10px;text-align: left">
        <span style="font-size: 18px">工具名称：</span>
        <el-input placeholder="请输入内容"
                  v-model="inputText6"
                  style="width: 100%;margin-top: 8px"
                  type="textarea"
                  :rows="2"></el-input>
      </div>
      <span slot="footer" class="dialog-footer">
    <el-button @click="dialogVisibleText = false">取 消</el-button>
    <el-button type="primary" @click="saveDataWorkBook">确 定</el-button>
  </span>
    </el-dialog>
    <!--点击上传照片-->
    <el-dialog
        :visible.sync="dialogPicture"
        :title="titleUse">
      <div style="margin-top: 10px;text-align: center; border: 1px solid #0269fa;padding: 10px">
        <el-upload
            action="http://10.255.96.48:3499/russiaEngine/"
            list-type="picture-card"
            :auto-upload="false"
            :on-change="(file, fileList) => saveFileAnnex(file, fileList)"
            :file-list="PictureList"
            :accept="fileType">
          <i slot="default" class="el-icon-plus"></i>
          <div slot="file" slot-scope="{file}">
            <img
                class="el-upload-list__item-thumbnail"
                :src="file.url" alt="">
            <span class="el-upload-list__item-actions">
                                <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
                              <i class="el-icon-zoom-in"></i>
                                </span>
                                <span v-if="!disabled" class="el-upload-list__item-delete" @click="handleDownload(file)">
                                  <i class="el-icon-download"></i>
                                </span>
                                <span v-if="!disabled" class="el-upload-list__item-delete" @click="handleRemove(file)">
                                  <i class="el-icon-delete"></i>
                                </span>
                              </span>
          </div>
        </el-upload>
      </div>
    </el-dialog>
    <!--点击上传视频-->
    <el-dialog
        :visible.sync="dialogVideo"
        :title="titleUse">
      <div style="margin-top: 10px;text-align: center; border: 1px solid #0269fa;padding: 10px">
        <el-upload
            action="http://10.255.96.48:3499/russiaEngine/"
            list-type="picture-card"
            :auto-upload="false"
            :on-change="(file, fileList) => saveFileAnnex(file, fileList)"
            :file-list="videoList"
            :accept="fileType">
          <i slot="default" class="el-icon-plus"></i>
          <div slot="file" slot-scope="{file}">
            <video width="100%"
                   height="100%"
                   :src="file.url"
                   controls>
            </video>
            <span class="el-upload-list__item-actions">
                                <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
                              <i class="el-icon-zoom-in"></i>
                                </span>
                                <span v-if="!disabled" class="el-upload-list__item-delete" @click="handleDownload(file)">
                                  <i class="el-icon-download"></i>
                                </span>
                                <span v-if="!disabled" class="el-upload-list__item-delete" @click="handleRemove(file)">
                                  <i class="el-icon-delete"></i>
                                </span>
                              </span>
          </div>
        </el-upload>
      </div>
    </el-dialog>
    <!--点击上传照片中的放大按钮，查看照片-->
    <el-dialog :visible.sync="dialogPictureAnnex">
      <img width="100%" :src="dialogImageUrl" alt="">
    </el-dialog>
    <!--弹窗展示每日产量的信息-->
    <el-dialog
        :title="titleUse"
        :visible.sync="productionDialog"
        width="50%"
        :before-close="handleClose">
      <div style="text-align: right">
        <el-link style="color: red" @click="productionClick(1,null)">新插入一条</el-link>
      </div>
      <div style="margin-top: 10px">
        <el-table
            :data="assProduction"
            border
            style="width: 100%">
          <el-table-column
              prop="dateUse"
              label="日期">
          </el-table-column>
          <el-table-column
              prop="assEb05"
              label="EB05">
          </el-table-column>
          <el-table-column
              prop="assEb35"
              label="EB35">
          </el-table-column>
          <el-table-column
              prop="assEb75"
              label="EB75">
          </el-table-column>
          <el-table-column
              prop="assEn19"
              label="EN19">
          </el-table-column>
          <el-table-column
              prop="assEn38"
              label="EN38">
          </el-table-column>
          <el-table-column
              v-slot:default="scope"
              label="编辑">
            <el-link style="margin-left: 15px" @click="productionClick(2,scope)"><i class="el-icon-edit"></i></el-link>
            <el-link style="margin-left: 15px" @click="productionClick(3,scope)"><i class="el-icon-delete"></i></el-link>
          </el-table-column>
        </el-table>
      </div>
      <div style="margin-top: 10px">
        <el-pagination
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
            :current-page="currentPage"
            :page-sizes="[20, 40, 60, 80]"
            :page-size="20"
            layout="total, sizes, prev, pager, next, jumper"
            :total="totalPage">
        </el-pagination>
      </div>
    </el-dialog>
    <!--弹窗展示每日产量的插入、编辑、删除的弹窗-->
    <el-dialog
        :title="titleUse1"
        :visible.sync="productionEditDialog"
        width="380px"
        :before-close="handleClose">

      <el-form ref="assProductionFrom" :model="assProductionFrom" label-width="100px">
        <div>
          <el-form-item label="生产日期">
            <el-date-picker
                v-model="assProductionFrom.dateUse"
                type="date"
                placeholder="选择日期"
                format="yyyy 年 MM 月 dd 日"
                value-format="yyyy-MM-dd"
                style="width:100%">
            </el-date-picker>
          </el-form-item>
          <el-form-item label="生产班次">
            <el-select v-model="assProductionFrom.classes" placeholder="请选择">
              <el-option
                  v-for="item in classesOptions"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value">
              </el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="EB05产量">
            <el-input-number v-model="assProductionFrom.assEb05" style="width: 100%"></el-input-number>
          </el-form-item>
          <el-form-item label="EB35产量">
            <el-input-number v-model="assProductionFrom.assEb35" style="width: 100%"></el-input-number>
          </el-form-item>
          <el-form-item label="EB75产量">
            <el-input-number v-model="assProductionFrom.assEb75" style="width: 100%"></el-input-number>
          </el-form-item>
          <el-form-item label="EN19产量">
            <el-input-number v-model="assProductionFrom.assEn19" style="width: 100%"></el-input-number>
          </el-form-item>
          <el-form-item label="EN38产量">
            <el-input-number v-model="assProductionFrom.assEn38" style="width: 100%"></el-input-number>
          </el-form-item>
        </div>
        <el-button @click="productionEditDialog=false">取 消</el-button>
        <el-button type="primary" @click="productionEdit">确 定</el-button>
      </el-form>
    </el-dialog>
    <!--弹窗展示各个检测日志记录中的信息-->
    <el-dialog
        :title="titleUse"
        :visible.sync="trendDialog"
        width="750px"
        :before-close="handleClose">
      <div>
        <el-table
            :data="ppkList"
            border
            style="width: 100%"
            height="400">
          <el-table-column
          type="expand"
          v-slot:default="scope">
            <div v-for="(value, index) in scope.row.valueUse.split('|*|')" :key="index">
              <span style="margin-left: 4px">{{ value.split('/')[1] }} &nbsp;:&nbsp;{{ value.split('/')[0] }};</span>
            </div>
          </el-table-column>
          <el-table-column
              prop="drawing"
              label="机型代码">
          </el-table-column>
          <el-table-column
              prop="op"
              label="工序">
          </el-table-column>
          <el-table-column
              prop="project"
              label="特性名称"
              width="120">
          </el-table-column>
          <el-table-column
              prop="startDate"
              label="起始日期">
          </el-table-column>
          <el-table-column
              prop="endDate"
              label="终止日期">
          </el-table-column>
          <el-table-column
              prop="ppk"
              label="计算值">
          </el-table-column>
          <el-table-column
              prop="editDate"
              label="计算时间">
          </el-table-column>
        </el-table>
      </div>
    </el-dialog>
    <el-dialog
        :title="titleUse1"
        :visible.sync="productionEditDialog"
        width="380px"
        :before-close="handleClose">

      <el-form ref="assProductionFrom" :model="assProductionFrom" label-width="100px">
        <div>
          <el-form-item label="生产日期">
            <el-date-picker
                v-model="assProductionFrom.dateUse"
                type="date"
                placeholder="选择日期"
                format="yyyy 年 MM 月 dd 日"
                value-format="yyyy-MM-dd"
                style="width:100%">
            </el-date-picker>
          </el-form-item>
          <el-form-item label="生产班次">
            <el-select v-model="assProductionFrom.classes" placeholder="请选择">
              <el-option
                  v-for="item in classesOptions"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value">
              </el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="EB05产量">
            <el-input-number v-model="assProductionFrom.assEb05" style="width: 100%"></el-input-number>
          </el-form-item>
          <el-form-item label="EB35产量">
            <el-input-number v-model="assProductionFrom.assEb35" style="width: 100%"></el-input-number>
          </el-form-item>
          <el-form-item label="EB75产量">
            <el-input-number v-model="assProductionFrom.assEb75" style="width: 100%"></el-input-number>
          </el-form-item>
          <el-form-item label="EN19产量">
            <el-input-number v-model="assProductionFrom.assEn19" style="width: 100%"></el-input-number>
          </el-form-item>
          <el-form-item label="EN38产量">
            <el-input-number v-model="assProductionFrom.assEn38" style="width: 100%"></el-input-number>
          </el-form-item>
        </div>
        <el-button @click="productionEditDialog=false">取 消</el-button>
        <el-button type="primary" @click="productionEdit">确 定</el-button>
      </el-form>
    </el-dialog>
    <!--弹窗展示长时间运算过程，让用户等待-->
    <el-dialog
        :title="titleUse"
        :visible.sync="waitDialog"
        width="350px"
        :before-close="handleClose"
        close-on-click-modal="close-on-click-modal">
      <div style="font-size: 60px">
        <i class="el-icon-loading"></i>
      </div>
      <div style="margin-top: 15px">
        <span>{{waitMessage}}</span>
      </div>
    </el-dialog>

  </div>
</template>

<script>
import * as echarts from "echarts"
import {
  filepath,
  tree_workshop_product_op_chinese,
  tree_workshop_product_op_english,
  tree_workshop_product_op_russian
} from "@/configUse";
import _, {toInteger} from "lodash";

export default {
  name: "controlTesting",
  components:{
  },
  data(){
  //校验标准值，必须为数字，且不能为空
    var valStandard = (rule, value, callback) => {
      if (value === '' || value === null || value === undefined) {
        const regex = /^[-+]?\d+(\.\d+)?$/;
        if (!regex.test(value)) {
          callback(new Error('请输入有效的数字'));
        }
      } else {
        callback(); // 如果值有效（包括0），则通过校验
      }
    };
    //上偏差，必须为数字，且不能为空
    var valCeiling = (rule, value, callback) => {
      if (value === '' || value === null || value === undefined) {
        const regex = /^[-+]?\d+(\.\d+)?$/;
        if (!regex.test(value)) {
          callback(new Error('请输入有效的数字'));
        }
      } else {
        callback(); // 如果值有效（包括0），则通过校验
      }
    };
    //下偏差，必须为数字，且不能为空
    var valLower = (rule, value, callback) => {
      if (value === '' || value === null || value === undefined) {
        const regex = /^[-+]?\d+(\.\d+)?$/;
        if (!regex.test(value)) {
          callback(new Error('请输入有效的数字'));
        }
      } else {
        callback(); // 如果值有效（包括0），则通过校验
      }
    };
    //验证是否为空
    var valVoid = (rule, value, callback) => {
      if (!value) {
        return callback(new Error('请输入内容'));
      } else {
        callback(); // 如果值有效（包括0），则通过校验
      }
    };
    var valFrequency = (rule, value, callback) => {
      if (value === '' || value === null || value === undefined) {
        const regex = /^[-+]?\d+(\.\d+)?$/;
        if (!regex.test(value)) {
          callback(new Error('请输入有效的数字'));
        }
      } else if (value>100 ||value===0){
        callback(new Error('请输入小于100的数值或非0值'))
      }else {
        callback(); // 如果值有效（包括0），则通过校验
      }
    };
    return{
      //记录用户当前选择的时间，他改变的时候，需要向后端进行生产量查询
      value1:this.nowDate(),
      //记录检测数据连续6点变化趋势的数量
      continuousSix:0,
      //记录PPK连续变化的趋势项次（变坏）
      capacityBad:0,
      //记录PPK连续变化的趋势项次（变好）
      capacityGood:0,
      //记录用户当前选择的班次，他改变的时候，需要向后端进行生产量查询
      classes:'',
      //树形导航的变量
      treeTesting:tree_workshop_product_op_chinese,
      //导航筛选的变量
      filterText:'',
      //树形的导航用到的数据模板
      defaultProps: {
        children: 'children',
        label: 'label'
      },

      //控制按钮样式
      buttonAll:'',
      button500:'',
      button300:'',
      button125:'',
      button25:{ backgroundColor: '#0269fa' },
      //控制时间空间的函数
      pickerOptions: {
        disabledDate(time) {
          return time.getTime() > Date.now();
        },
        shortcuts: [{
          text: '今天',
          onClick(picker) {
            picker.$emit('pick', new Date());
          }
        }, {
          text: '昨天',
          onClick(picker) {
            const date = new Date();
            date.setTime(date.getTime() - 3600 * 1000 * 24);
            picker.$emit('pick', date);
          }
        }, {
          text: '一周前',
          onClick(picker) {
            const date = new Date();
            date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
            picker.$emit('pick', date);
          }
        }]
      },
      /*弹窗需要的变量*/
      //弹窗显示的信息
      titleMessage:'',
      //控制“编辑”弹窗
      dialogVisibleTesting:false,
      //控制修改数据中的修改日期的弹窗
      dialogVisibleDate:false,
      //控制修改数据中的修改文本类的
      dialogVisibleName:false,
      //需要修改的文本的用户输入的变量
      inputName:'',
      //弹窗的标题
      titleUse:'',
      //二级弹窗的标题
      titleUse1:'',
      //用户要选择修改行的Id
      testingEditUseId:-1,
      //用户修改数据，
      tableIndex:-1,
      //记录修正数据，用户选择的是那个操作
      useDoe:-1,

      //作业指导书中用到的变量
      //控制编辑作业指导书的步骤的弹窗
      dialogVisibleText:false,
      //弹窗用到的输入变量
      inputText1:'',//记录作业步骤
      inputText2:'',//记录注意点
      inputText3:'',//品质检查
      inputText4:'',//设备名称
      inputText5:'',//辅料名称
      inputText6:'',//工具名称
      inputNum:0,//用户输入的时间

      //记录用户选择的是那种操作方式，编辑1，删除为2，向上插入为3，向下插入为4.
      doe:0,
      //返回用户选择数据的index。
      selectedIndexUse:0,
      /*用在aside的变量数据*/
      //记录页面呈现的导航信息
      TreeList:[],
      //记录后台返回的三种语言的导航信息
      TreeListAll:[],
      //点击导航栏，用到的变量
      ChildrenLabel:'no',
      parentLabel:'no',
      parentParentLable:'no',
      //记录用户选择的语言，默认为中文
      languageS:"chinese",
      /*三种语言的选择项目*/
      //记录导航中的三种语言的车间名称
      workshopEnglish:'',
      workshopChinese:'',
      workshopRussian:'',
      project:'project',
      //记录检验要求
      requirement:'requirement',
      //分页标签用的指定和判别分页的变量
      activeName: 'second',
      //用户输入的工件号
      workpieceInput:'',

      //记录用户选择的检测时间
      valueDate:'',
      valueDateUse:'',

      //列表需要展现的数据，筛选出的是“频次检测”检测项目，员工填入的列表中的所有的数据
      tableData: [{
        //主键
        id:-1,
        //车间名称（中文）
        workshop:'',
        //车间名称（英文）
        workshopEnglish:'',
        //车间名称（俄文）
        workshopRussian:'',
        //图号
        drawing:'',
        //工序号
        op:'',
        //记录检验项目
        project:'',
        //记录检验项目（英文）
        projectEnglish:'',
        //记录检验项目（俄文）
        projectRussian:'',
        //记录检验要求
        requirement:'',
        //记录检验要求（英文）
        requirementEnglish:'',
        //记录检验要求（俄文）
        requirementRussian:'',
        //记录检测类型
        typeTesting:'',
        //记录标准值
        standard:'',
        //记录上偏差
        ceiling:'',
        //记录下偏差
        lower:'',
        //frequency
        frequency:'',
        //记录实施部门
        department:'',
        //记录实施部门（英文）
        departmentEnglish:'',
        //记录实施部门（俄文）
        departmentRussian:'',
        //项目类型（1：代表控制计划项目，2：代表自行识别项目，3：代表控制计划加严项目）
        projectType:'',
        //关联控制计划的标记位
        controlTesting:'',
        //删除标记位（1：正常，0：删除）
        deleteSign:1,
        //记录顺序号
        orderNumber:0,
        //记录用户的实测值
        valueUse:'',
        //判断是否合格
        //控制显示判定是否合格的变量(0:没有参数，1：合格；2：不合格；3：超出控制线
        passUse:0,
        //检验员工号
        userId:'',
        //检测日期
        testingDate:'null',
        //检测的工件号
        workpiece:'null',
        //作业指导书
        workBook:'',
      },],

      //作业指导书的数据表
      workBook:[
        {
          id:0,
          work:'请编辑',//工作项目
          problem:'请输入',//关注点
          inspect:'请输入',//品质检查
          spendTime:0,//需要时间
          controlPlan:0,//控制计划的关联项
          toll:'',//工具
          device:'',//设备
          accessories:'',//辅料,
          pictureList:'',//图片列表
          videoList:''//视频列表
        }
      ],

      //编辑数据表单的变量
      tableDataTemp: {
        //主键
        id:-1,
        //车间名称（中文）
        workshop:'',
        //车间名称（英文）
        workshopEnglish:'',
        //车间名称（俄文）
        workshopRussian:'',
        //图号
        drawing:'',
        //工序号
        op:'',
        //记录检验项目
        project:'',
        //记录检验项目（英文）
        projectEnglish:'',
        //记录检验项目（俄文）
        projectRussian:'',
        //记录检验要求
        requirement:'',
        //记录检验要求（英文）
        requirementEnglish:'',
        //记录检验要求（俄文）
        requirementRussian:'',
        //记录检测类型
        typeTesting:'',
        //记录标准值
        standard:'',
        //记录上偏差
        ceiling:'',
        //记录下偏差
        lower:'',
        //frequency
        frequency:'',
        //记录实施部门
        department:'',
        //记录实施部门（英文）
        departmentEnglish:'',
        //记录实施部门（俄文）
        departmentRussian:'',
        //项目类型（1：代表控制计划项目，2：代表自行识别项目，3：代表控制计划加严项目）
        projectType:'',
        //关联控制计划的标记位
        controlTesting:'',
        //删除标记位（1：正常，0：删除）
        deleteSign:1,
        //记录顺序号
        orderNumber:0,
        //记录用户的实测值
        valueUse:'',
        //判断是否合格
        //控制显示判定是否合格的变量(0:没有参数，1：合格；2：不合格；3：超出控制线
        passUse:0,
        //检验员工号
        userId:'',
        //检测日期
        testingDate:'null',
        //检测的工件号
        workpiece:'null',
        //记录用户选择的要查询的数据量是多少
        selectNum:'',
        //作业指导书内容
        workBook:'',
      },
      //记录计量型的数据，用户录入检测数据用。
      tableDataValueUse:[],
      //记录用户筛选出查看趋势图的数据，也用在了维护数据正确性的页面上
      tableDataValueEdit:[],
      //三种语言切换的变量
      //主键
      //车间名称（中文）
      workshop:'',
      //图号
      drawing:'',
      //工序号
      op:'',
      //记录实施部门
      department:'',
      //检测类型选择器
      options: [
          {
        value: '目视/visual/Визуальное зрение',
        label: '目视/visual/Визуальное зрение'
      }, {
        value: '计量/metering/Измерение',
        label: '计量/metering/Измерение'
      }, {
        value: '计数/count/Количество',
        label: '计数/count/Количество'
      }],
      optionsD: [
          {
        value: '品质管理科/Quality Management Department/Секция управления качеством',
        label: '品质管理科/Quality Management Department/Секция управления качеством'
      }, {
        value: '装配车间/Assembly workshop/сборочный цех',
        label: '装配车间/Assembly workshop/сборочный цех'
      }, {
        value: '机加车间/Machining workshop/Машиностроительный цех',
        label: '机加车间/Machining workshop/Машиностроительный цех'
      }, {
        value: '物流科/Logistics Department/Отдел логистики',
        label: '物流科/Logistics Department/Отдел логистики'
      }],
      //校验数据用的函数

      rules:{
        standard:[{validator: valStandard, trigger: 'blur'}],
        ceiling:[{validator: valCeiling, trigger: 'blur'}],
        lower:[{validator: valLower, trigger: 'blur'}],

        requirement:[{validator: valVoid, trigger: 'blur'}],
        requirementEnglish:[{validator: valVoid, trigger: 'blur'}],
        requirementRussian:[{validator: valVoid, trigger: 'blur'}],

        project:[{validator: valVoid, trigger: 'blur'}],
        projectEnglish:[{validator: valVoid, trigger: 'blur'}],
        projectRussian:[{validator: valVoid, trigger: 'blur'}],

        typeTesting:[{validator: valVoid, trigger: 'blur'}],
        department:[{validator: valVoid, trigger: 'blur'}],
        frequency:[{validator: valFrequency, trigger: 'blur'}],
      },
      /*图表需要的数据展现区域*/
      //记录用户想看的数据是多少组
      selectNum:25,
      tempDataX:[],
      tempDataS:[],
      tempDataSt:[],
      tempDataCe:[],
      tempDataLo:[],

      //Echarts实例设计到的函数
      //画趋势图
      chartUser: null, // 保存ECharts实例
      option: {
        title:{
          //设置标题的样式
          textStyle:{
            color:'red',
          },
          //设置标题的居中方式（水平）
          x:'center',
          text:'暂未选择',
        },
        xAxis:{
          data:[]
        },
        yAxis:{
          type: 'value',
          min:0, // 设置y轴的最小值
          max:100,//设置y轴的最大值
        },
        series:[{
          //设置系列，设置当前映射出的图形
          name:'valueUse',
          type:'line',
          stack:'num',
          data:[]
        },
          {
            //设置系列，设置当前映射出的图形
            name:'standard',
            type:'line',
            stack:'standard',
            data:[]
          },
          {
            //设置系列，设置当前映射出的图形
            name:'ceiling',
            type:'line',
            stack:'ceiling',
            data:[]
          },
          {
            //设置系列，设置当前映射出的图形
            name:'lower',
            type:'line',
            stack:'lower',
            data:[]
          },],
        grid: {
          top:'8%',
          left: '2%', // 图表内容距离容器左侧的距离
          right: '2%', // 图表内容距离容器右侧的距离
          bottom: '10%', // 图表内容距离容器底部的距离，可以适当增加这个值来留出更多空间给标题
          containLabel: true, // 网格是否包含坐标轴的标签在内
        },
        tooltip:{
          //触发类型
          trigger:'axis',
          //设置坐标轴的指示器
          axisPointer:{
            type: 'cross'
          },
        },
      },
      //画直方图
      chartUserBor:null,
      optionBor: {
        tooltip: {
          trigger: 'axis',
          axisPointer: {
            type: 'shadow'
          }
        },
        grid: {
          top:'3%',
          left: '3%',
          right: '4%',
          bottom: '10%',
          containLabel: true
        },
        xAxis: [
          {
            type: 'category',
            data: ['1/10', '2/10', '3/10', '4/10', '5/10', '6/10','7/10','8/10','9/10','10/10'],
            axisTick: {
              alignWithLabel: true
            }
          }
        ],
        yAxis: [
          {
            type: 'value'
          }
        ],
        series: [
          {
            name: 'Direct',
            type: 'bar',
            barWidth: '60%',
            data:[]
          }
        ]
      },
      //画移动极差图
      chartUserLien:null,
      optionLien: {
        title:{
          //设置标题的样式
          textStyle:{
            color:'red',
          },
          //设置标题的居中方式（水平）
          x:'center',
        },
        xAxis:{
          data:[]
        },
        yAxis:{
          type: 'value',
          min:0, // 设置y轴的最小值
          max:100,//设置y轴的最大值
        },
        series:[{
          //设置系列，设置当前映射出的图形
          name:'valueUse',
          type:'line',
          stack:'num',
          data:[]
        },
          {
            //设置系列，设置当前映射出的图形
            name:'standard',
            type:'line',
            stack:'standard',
            data:[]
          },
          {
            //设置系列，设置当前映射出的图形
            name:'ceiling',
            type:'line',
            stack:'ceiling',
            data:[]
          },
          {
            //设置系列，设置当前映射出的图形
            name:'lower',
            type:'line',
            stack:'lower',
            data:[]
          },],
        grid: {
          top:'8%',
          left: '2%', // 图表内容距离容器左侧的距离
          right: '2%', // 图表内容距离容器右侧的距离
          bottom: '10%', // 图表内容距离容器底部的距离，可以适当增加这个值来留出更多空间给标题
          containLabel: true, // 网格是否包含坐标轴的标签在内
        },
        tooltip:{
          //触发类型
          trigger:'axis',
          //设置坐标轴的指示器
          axisPointer:{
            type: 'cross'
          },
        },
      },
      //过程能力相关的项目
      cpk:0,

      //判异用到的变量
      //记录是否有连续6个点上升的情况
      riseSix:[],

      /*管理中台中用到的变量*/
      //记录用户输入的当日产量
      eb05:220,//EB机型
      en19:0,
      eb35:0,
      //记录当日需要检测的项目数量
      testNumber:100,
      //记录当日已检测完毕项目数量
      finishNumber:86,
      //记录当日未完成的检测项目数量
      noFinishNumber:14,
      //记录检测合格项目数量
      passNumber:0,
      //记录检测不合格项目数量
      noPassNumber:0,
      //用户权限相关的变量
      useName:'',//用户名称
      useId:'',//用户编号
      usePower:'',//用户权限 1.最高权限，所有的内容都可以操作；2.可以作为数据录入；其他：只能观看

      //管理模型建议数组
      suggestAi:[
        '管理建议1：EB05螺栓力矩PPK数量多，根据机理，可能测量系统存在异常，请核对；',
        '管理建议2：2024年10月份，EB05螺栓力矩PPK不合格需要立项管理，请质量管理员立项',
        '管理建议3：90天内，0个特性（点击查看）过程能力变差，请品质管理人员识别是否需要立项；（数据不足，暂未计算）',
        '管理建议4：请将您的判断条件与数据分析工程师说明，更新系统后可自动运行；',
        '管理建议6：30天内，*****个特性（点击查看）过程能力变差，请品质管理人员识别是否需要立项；',
        '管理建议7：90天内，*****个特性（点击查看）过程能力变差，请品质管理人员识别是否需要立项；',
        '管理建议8：30天内，*****个特性（点击查看）过程能力突变，请品质管理人员识别是否需要立项；'
      ],

      //维护每日生产信息的变量
      assProduction:[
        {
          //主键
          id:'',
          //日期
          dateUse:'',
          //班次
          classes:'',
          //装配EB05生产量
          assEb05:'',
          //装配EB35生产量
          assEb35:'',
          //装配EB75生产量
          assEb75:'',
          //装配EN19生产量
          assEn19:'',
          //装配EN38生产量
          assEn38:'',
          //删除标记位
          deleteSign:'',
          //创建时间
          establishTime:'',
          //修改时间
          updateTime:'',
          //编辑人姓名
          editName:'',
        }
      ],
      //编辑窗口的变量
      assProductionFrom:{
        //主键
        id:'',
        //日期
        dateUse:'',
        //班次
        classes:'',
        //装配EB05生产量
        assEb05:0,
        //装配EB35生产量
        assEb35:0,
        //装配EB75生产量
        assEb75:0,
        //装配EN19生产量
        assEn19:0,
        //装配EN38生产量
        assEn38:0,
        //删除标记位
        deleteSign:'',
        //创建时间
        establishTime:'',
        //修改时间
        updateTime:'',
        //编辑人姓名
        editName:'',
      },
      //窗口显示的产量内容
      assProductionShow:{
        //主键
        id:'',
        //日期
        dateUse:'',
        //班次
        classes:'',
        //装配EB05生产量
        assEb05:0,
        //装配EB35生产量
        assEb35:0,
        //装配EB75生产量
        assEb75:0,
        //装配EN19生产量
        assEn19:0,
        //装配EN38生产量
        assEn38:0,
        //删除标记位
        deleteSign:'',
        //创建时间
        establishTime:'',
        //修改时间
        updateTime:'',
        //编辑人姓名
        editName:'',
      },
      //每日生产信息的点击变量
      assProductionScope:null,
      //每日生产信息的编辑类型
      assProductionDoe:0,

      //控制显示每日产量的弹窗变量
      productionDialog:false,
      //控制编辑每日产量的弹窗变量
      productionEditDialog:false,
      //控制展示趋势板块检测日志的弹窗
      trendDialog:false,


      //记录班次的选择器
      classesOptions:[
        {value:'A',label: 'A'},
        {value:'B',label: 'B'},
        {value:'C',label: 'C'}
      ],

      //作业指导书用到的变量
      //用作作业指导书表头部分的选择
      workBookHeard1:'#0269fa',
      workBookHeard2:'',
      workBookHeard3:'',
      workBookHeard4:'',
      workBookHeardColour1:'white',
      workBookHeardColour2:'',
      workBookHeardColour3:'',
      workBookHeardColour4:'',

      //图片、视频切换的按钮样式变量
      videoAndImage1:'#0269fa',
      videoAndImage2:'',
      //图片、视频切换的按钮颜色变化
      videoAndImageColor1:'white',
      videoAndImageColor2:'',

      //加载忙控制
      loading:false,


      //图片相关的数据，录像相关的项目
      itemView:[],//展示图片了路径,用在了走马灯部位
      itemViewVideo:[],//展示了录像的路径，用在录像的走马灯上
      editPictureType:0,//修改图片的类型，主要记录了
      PictureList:[],//图片文件的
      videoList:[],//录像的文件列表
      disabled:false,//图片显示的控制变量
      dialogImageUrl:'',//弹窗显示的图片路径
      videoUrl:'',//视频的地址
      fileType:'',//限定上传文件的类型
      //上传照片的弹窗
      dialogPicture:false,
      //上传视频的弹窗
      dialogVideo:false,
      //上传图片的弹窗打开后，点击放大管控弹窗提示
      dialogPictureAnnex:false,

      //需要用户等待的弹窗控制变量
      waitDialog:false,
      //等待是的消息
      waitMessage:'请等待',

      //点击主表行中传递出来的信息Scope格式
      tableDataScope:'',
      //记录用户编辑作业指导书变量
      editBookUse:'',
      //记录点击作业指导书传递出来的信息Scope格式
      editBookScope:'',
      //记录用户选择的是看图片，还是看视频。1:看图片；2:看视频；
      editVideoAndImageUse:1,
      //记录用户选择的看作业指导书上的那个类型，1：代表是作业指导书；2.
      workBookHeardUse:1,
      //控制计划相关的变量
      tableDataControl: [{
          //记录主键ID
          id: null,
          //零件/过程编号
          processNumber: '',
          processNumberEnglish:'',
          processNumberRussian:'',
          //机器、夹具、装置、工装
          device: '',
          deviceEnglish:'',
          deviceRussian:'',
          //过程名称/操作描述
          operation: '',
          operationEnglish:'',
          operationRussian:'',
          //编号
          numberOrder: '',
          //产品
          product: '',
          productEnglish:'',
          productRussian:'',
          //过程
          processUse: '',
          processUseEnglish:'',
          processUseRussian:'',
          //特殊特性分类
          characteristic:'',
          //产品、过程规范、公差
          specification: '',
          specificationEnglish:'',
          specificationRussian:'',
          //评价、测量技术
          measure: '',
          measureEnglish:'',
          measureRussian:'',
          //容量
          capacity: '',
          capacityEnglish:'',
          capacityRussian:'',
          //频率
          frequency: '',
          frequencyEnglish:'',
          frequencyRussian:'',
          //控制方法
          method: '',
          methodEnglish:'',
          methodRussian:'',
          //责任部门
          department: '',
          departmentEnglish:'',
          departmentRussian:'',
          //反应计划
          reaction:0,
          //产品图号
          drawing: '',
          //工序号
          op: 0,
          //车间名称
          workshop:'',
          workshopEnglish:'',
          workshopRussian:'',
          //记录顺序用
          orderNumber:0,
          //记录删除标记
          deleteSign:1,
        }],
      //作业指导书控制计划部分的数据集合
      controlPlanData:[
        {
          //主键
          id:-1,
          //产品/过程规范/公差
          specification:'',
          //评价
          measure:'',
          //容量
          capacity:'',
          //频率
          frequency:'',
          //控制方法
          method:'',
        },
      ],

      //检测数据的日志数据库记录
      assTestLog:[
        {
          //主键
          id:0,
          //日期
          dateUse:'',
          //记录类型（都是用的中文）  类型有：1：当日应检测数量；2：EB05PPK
          assTestLog:'',
          //记录信息
          messageLog:'',
          //删除标记位
          deleteSign:'',
          //创建时间
          establishTime:'',
          //修改时间
          updateTime:'',
          //编辑人姓名
          editName:'',
        }
      ],
      //记录关于PPK的计算结果的数组
      ppkList:[
        {
          //过程分割符|%|，25组数据分割符用|*|，特性名称语言分割符用|*|
          //主键
          id: 0,
          //机型代码
          drawing:'',
          //工序代码
          op:'',
          //特性名称(中文）
          project:'',
          //特性名称(英文）
          projectEnglish:'',
          //特性名称(俄文）
          projectRussian:'',
          //计算起始日期
          startDate:'',
          //计算终止日期
          endDate:'',
          //计算值
          ppk:'',
          //25组数据值
          valueUse:'',
          //标准值
          standard:'',
          //上公差值
          ceiling:'',
          //下公差值
          lower:'',
          //编辑人
          editName:'',
          //编辑时间
          editDate:'',
        }
      ],
      //记录月度的ppk计算记录数据:EB05
      ppkListMEB05:[
        {
          //过程分割符|%|，25组数据分割符用|*|，特性名称语言分割符用|*|
          //主键
          id: 0,
          //机型代码
          drawing:'',
          //工序代码
          op:'',
          //特性名称(中文）
          project:'',
          //特性名称(英文）
          projectEnglish:'',
          //特性名称(俄文）
          projectRussian:'',
          //计算起始日期
          startDate:'',
          //计算终止日期
          endDate:'',
          //计算值
          ppk:'',
          //25组数据值
          valueUse:'',
          //标准值
          standard:'',
          //上公差值
          ceiling:'',
          //下公差值
          lower:'',
          //编辑人
          editName:'',
          //编辑时间
          editDate:'',
        }
      ],
      //记录月的的PPK计算不合格的数据：EB05
      ppkListMEB05OK:[
        {
          //过程分割符|%|，25组数据分割符用|*|，特性名称语言分割符用|*|
          //主键
          id: 0,
          //机型代码
          drawing:'',
          //工序代码
          op:'',
          //特性名称(中文）
          project:'',
          //特性名称(英文）
          projectEnglish:'',
          //特性名称(俄文）
          projectRussian:'',
          //计算起始日期
          startDate:'',
          //计算终止日期
          endDate:'',
          //计算值
          ppk:'',
          //25组数据值
          valueUse:'',
          //标准值
          standard:'',
          //上公差值
          ceiling:'',
          //下公差值
          lower:'',
          //编辑人
          editName:'',
          //编辑时间
          editDate:'',
        }
      ],
      ppkListMEB05NG:[
        {
          //过程分割符|%|，25组数据分割符用|*|，特性名称语言分割符用|*|
          //主键
          id: 0,
          //机型代码
          drawing:'',
          //工序代码
          op:'',
          //特性名称(中文）
          project:'',
          //特性名称(英文）
          projectEnglish:'',
          //特性名称(俄文）
          projectRussian:'',
          //计算起始日期
          startDate:'',
          //计算终止日期
          endDate:'',
          //计算值
          ppk:'',
          //25组数据值
          valueUse:'',
          //标准值
          standard:'',
          //上公差值
          ceiling:'',
          //下公差值
          lower:'',
          //编辑人
          editName:'',
          //编辑时间
          editDate:'',
        }
      ],

      //记录每天的检测情况信息的数据库结构：当日检测数量
      everyDayTestEB05:{
        //EB05应检查数量
        num:'',
        //实际检测数量
        actual:'',
        //合格数量
        ok:'',
        //不合格数量
        ng:'',
        //预留
        reserve1:'',
        //预留
        reserve2:'',
        //预留
        reserve3:'',
      },

      //分页用到的变量，默认第几页
      currentPage:1,
      //记录分页上总计有多少条数据
      totalPage:0,
      //当前用户选择的分页数据,每页多少条
      sizeChangeProduction:20,
      //当前用户选择的分页数据,第几页
      currentChangeProduction:1,

      //EB05PPK月度计算日期
      EB05PPKDateM:'请刷新',
      //记录小于1.33的数量
      EB05PPKDate133:0,
    }
  },
  watch:{
    filterText(val) {
      this.$refs.tree.filter(val);
    },
    classes: {
      handler(newVal, oldVal) {
        console.log('Classes object changed:', newVal, oldVal);
        for (let i = 0; i < this.tableDataValueUse.length; i++) {
          this.$set(this.tableDataValueUse[i], 'classes', newVal);
        }
        // 在这里处理变化
      },
      deep: true, // 深度监视对象
      immediate: true // 如果需要在绑定时立即执行一次，则设置为 true
    }
  },
  methods:{
    //导航筛选的函数
    filterNode(value, data) {
      if (!value) return true;
      return data.label.indexOf(value) !== -1;
    },
    //点击导航进行的筛选
    treeClick(data,node){
      //作业指导书显示需要清空
      this.workBook=[]
      this.tableDataScope=null
      this.editBookScope=null
      //这里的所有接口都走到《控制计划页的接口》.并且重新整理数据表。使用新的数据表。
      //根据点击的内容，查询控制计划中的信息
      if (data.label.includes('OP') || data.label.includes('GG') || data.label.includes('HL')){
        //表明现在的点击是已经到了工序部位了。
        // 向后端发送请求，按照工序号、产品名称、车间名称进行筛选需要的内容
        this.$request.post('/inquiryControlTestingByOp',{
          firstFieldName:'workshop',
          firstFieldVal:node.parent.parent.data.label,
          secondFieldName:'drawing',
          secondFieldVal:node.parent.data.label,
          thirdFieldName:'op',
          thirdFieldVal:data.label,
        })
            .then(result=>{
              if (result.code === 401) {
                this.$router.push('UserLogin')
                alert("您未登录，请登录")
              }else {
                //对大表赋值
                this.tableData=result.data
                //对输入数据的列表进行赋值
                this.tableDataValueUse=[]
                for (let i = 0; i < this.tableData.length; i++) {
                  //添加主表缺少的检验人员信息
                  this.tableData[i].userId = this.useId
                  //添加主表缺少的检测日期信息
                  this.tableData[i].testingDate = 'null'
                  this.tableData[i].workpiece = 'null'
                  //添加主表缺少的班次
                  this.tableData[i].classes=this.classes
                  //添加主表缺少的检测工件号信息
                  if (this.tableData[i].typeTesting === '计量/metering/Измерение') {
                    this.tableDataValueUse.push(this.tableData[i])
                    this.workpieceInput = ''
                    this.valueDate = ''
                    this.valueDateUse = ''
                  }
                }
              }
              for (let i = 0; i < this.tableDataValueUse.length; i++) {
                this.tableDataValueUse[i].valueUse=''
              }
              console.log(this.tableDataValueUse)
            })
      }
    },
    //当填写的时间变化的时候
    dateChange(){
      //判断有没有数据，没有数据不让选择时间，提示选择工序
      if (this.tableDataValueUse.length===0){
        alert("您未选择工序，或无检测项目，请核对后进行操作")
        this.valueDate=''
        this.valueDateUse=''
      }else {
        const date = new Date(this.valueDate);
        const year = date.getFullYear().toString().padStart(4, '0');
        const month = (date.getMonth() + 1).toString().padStart(2, '0'); // 月份从0开始，所以需要+1
        const day = date.getDate().toString().padStart(2, '0');
        this.valueDateUse=`${year}-${month}-${day}`
      }
      for (let i = 0; i < this.tableDataValueUse.length; i++) {
        this.tableDataValueUse[i].testingDate=this.valueDateUse
      }
    },
    //当用户输入的工件号有改变的时候
    workpieceChang(){
      if (this.tableDataValueUse.length===0){
        alert("请选择工序后开始编辑")
        this.workpieceInput=''
        return
      }
      let temp=this.tableDataValueUse
      this.tableDataValueUse=[]
      for (let i = 0; i < temp.length; i++) {
        this.$set(temp[i], 'workpiece', this.workpieceInput);
      }
      this.tableDataValueUse=temp
    },
    //监控输入
    handleBlur(value,valueUse) {
      // 这里你可以访问到 event 对象，以及通过 this 访问到 Vue 实例的属性和方法
      let passMin=value-(this.tableDataValueUse[valueUse].standard+this.tableDataValueUse[valueUse].lower)
      let passMax=this.tableDataValueUse[valueUse].standard+this.tableDataValueUse[valueUse].ceiling-value
      if (passMax>=0 && passMin>=0){
        this.tableDataValueUse[valueUse].passUse=1
      }else if (passMin<0 || passMax<0){
        this.tableDataValueUse[valueUse].passUse=2
      }else {
        this.tableDataValueUse[valueUse].passUse=0
      }
    },
    //设置判定的颜色
    getButtonStyle(index) {
      const passUse = this.tableDataValueUse[index].passUse;
      let style = { backgroundColor: 'black' }; // 默认样式
      if (passUse === 1) {
        style.backgroundColor = 'royalblue';
      } else if (passUse === 2) {
        style.backgroundColor = 'red';
      } else if (passUse === 3) {
        // 设置其他颜色...
      } else if (passUse===0){
        style.backgroundColor = 'black';
      }
      return style;
    },
    //当选择的语言是中文的时候
    languageSelectChinese(){
      this.languageS="chinese"
      this.treeTesting=tree_workshop_product_op_chinese
      this.project='project'
      this.requirement='requirement'
    },
    //当选择语言为俄文时
    languageSelectRussian(){
      this.languageS="russian"
      //赋值导航内容
      this.treeTesting=tree_workshop_product_op_russian
      this.project='projectRussian'
      this.requirement='requirementRussian'
    },
    //当选择语言为英语时
    languageSelectEnglish(){
      this.languageS="english"
      this.treeTesting=tree_workshop_product_op_english
      this.project='projectEnglish'
      this.requirement='requirementEnglish'
    },
    //单击分页标签做出的反应
    handleClick(tab, event) {
      console.log(tab, event);
      if (tab.label==='检测数据录入'){
        this.classes=''
        for (let i = 0; i < this.tableDataValueUse.length; i++) {
          this.tableDataValueUse[i].valueUse=''
        }
      }
      if (this.activeName==='fourth'){
        //需要完善
        this.alreadyCompleted('1000100XEB05')
      }
    },
    //通用的关闭弹窗的操作
    handleClose(done) {
      this.$confirm('确认关闭？')
          .then(_ => {
            console.log(_)
            done();
          })
          .catch(_ => {
            console.log(_)
          });
    },
    //点击弹出的窗口“提交”按钮后的动作，向后端发送数据，进行保存
    submitForm(formName) {
      this.$refs[formName].validate((valid) => {
        if (valid) {
          //当点击编辑的时候触发的条件
          if (this.doe===1){
            //执行“编辑”编辑操作
            //向后端写数据
            //判断选择的检测类型，如果是计量型和计数型，对数据进行限定
            if (this.tableDataTemp.typeTesting==='目视/visual/Визуальное зрение' && this.tableDataTemp.typeTesting==='计数/count/Количество'){
              this.tableData.standard=0
              this.tableData.ceiling=0
              this.tableData.lower=0
            }

            this.tableDataTemp.projectType=2
            //3.对删除标记位进行赋值
            this.tableDataTemp.deleteSign=1
            //对部门进行赋值(没有开发）
            //向后端发送信息，保存数据
            this.$request.put('ControlTestingPut',this.tableDataTemp).then(result=>{
              if (result.code === 401){
                this.$router.push('UserLogin')
                alert("您未登录，请登录")
              }else {
                this.tableData=result.data
                alert("已经修改成功")
                this.dialogVisibleTesting=false;
              }
            })
          }
          else if (this.doe===2){
            //执行删除操作
            if (confirm("确定要删除吗？")){
              //设置标记位
              this.tableDataTemp.deleteSign=0
              //执行修改请求
              //向后端发送信息，保存数据
              this.$request.put('ControlTestingPut',this.tableDataTemp).then(result=>{
                if (result.code === 401){
                  this.$router.push('UserLogin')
                  alert("您未登录，请登录")
                }else {
                  this.tableData=result.data
                  alert("已经修改成功")
                  this.dialogVisibleTesting=false
                }
              })
            }else {this.dialogVisibleTesting=false}
          }
          else if (this.doe===3) {/*执行插入操作，所有的列表数据均需要修改*///把数据插入进去
            this.tableDataTemp.id = -1//把新数据的Id设置为-1，方便后端判断
            //编辑初始的数据
            //判断选择的检测类型，如果是计量型和计数型，对数据进行限定
            if (this.tableDataTemp.typeTesting === '目视/visual/Визуальное зрение' && this.tableDataTemp.typeTesting === '计数/count/Количество') {
              this.tableDataTemp.standard = 0
              this.tableDataTemp.ceiling = 0
              this.tableDataTemp.lower = 0
            }
            //1.对车间名称赋值\图号\工序号进行赋值
            this.tableDataTemp.workshop = this.workshopChinese
            this.tableDataTemp.workshopEnglish = this.workshopEnglish
            this.tableDataTemp.workshopRussian = this.workshopRussian
            this.tableDataTemp.drawing = this.parentLabel
            this.tableDataTemp.op = this.ChildrenLabel.slice(2)
            //3.对删除标记位进行赋值
            this.tableDataTemp.deleteSign = 1
            //对控制计划的项目进行标记
            this.tableDataTemp.controlTesting = -1
            //对类型进行设置
            this.tableDataTemp.typeTesting=2
            //对数据加入到队列中
            let Temp = this.tableData
            Temp.splice(this.selectedIndexUse + 1, 0, this.tableDataTemp)
            //重新排布顺序号,对检测类型为2（自行添加的）进行重新排号，不是的不进行编号
            //作为数组的编号变量
            let j=0;
            for (let i = 0; i < Temp.length; i++) {
              if (Temp[i].typeTesting===2){
                Temp[i].orderNumber = i
                i=j+1
              }
            }
            //向后端发送一个Post请求，修改数据
            this.$request.post("/controlTestingInsertList", Temp).then(result => {
              if (result.code === 401) {
                this.$router.push('UserLogin')
                alert("您未登录，请登录")
              } else {
                this.tableData = result.data
                alert("已经修改成功")
                this.dialogVisibleTesting = false;
              }
            })
          }
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    //点击弹窗中的“重置”按钮
    resetForm(formName) {
      this.$refs[formName].resetFields();
    },
    //点击“检测数据录入”的“保存”按钮的时候，对数据进行保存
    valueDateSave(){
      //把编辑过的数据筛选出来，对于检测值为空的值，去除
      let temp=[]
      for (let i = 0; i < this.tableDataValueUse.length; i++) {
        if (this.tableDataValueUse[i].valueUse!==''){
          temp.push(this.tableDataValueUse[i])
        }
      }
      if (temp.length===0){
        alert("无数据需要保存")
        return;
      }
      //校验数据，如果工件号没有，提示无工件号
      for (let i = 0; i < temp.length; i++) {
        if (temp[i].workpiece==='null'){
          alert("有“工件号”未填写，请检查")
          return
        }
        if (temp[i].testingDate==='null'){
          alert("有项目的检测时间未设置，请设置")
          return;
        }
      }
      //校验通过，向后端写数据
      this.$request.post('/testingValInsert',temp).then(result=>{
        if (result.code === 401){
          this.$router.push('UserLogin')
          alert("您未登录，请登录")
        }else {
          this.tableDataValueUse=[]
          alert("已经保存成功，如果还有录入需求，请再次点击工序")
        }
      })
    },
    //点击画图的数据，选择是多少组，按钮进行变色
    chart(nub){
      if (nub===25){
        this.selectNum=25
        this.button25={ backgroundColor: '#0269fa' }
        this.button125={}
        this.button300={}
        this.button500={}
        this.buttonAll={}

      }
      else if (nub===125){
        this.selectNum=125
        this.button25={}
        this.button125={ backgroundColor: '#0269fa' }
        this.button300={}
        this.button500={}
        this.buttonAll={}
      }
      else if (nub===300){
        this.selectNum=300
        this.button25={}
        this.button125={}
        this.button300={ backgroundColor: '#0269fa' }
        this.button500={}
        this.buttonAll={}
      }
      else if (nub===500){
        this.selectNum=500
        this.button25={}
        this.button125={}
        this.button300={}
        this.button500={ backgroundColor: '#0269fa' }
        this.buttonAll={}
      }
      else if (nub==='all'){
        this.selectNum=10000
        this.selectNum=500
        this.button25={}
        this.button125={}
        this.button300={}
        this.button500={}
        this.buttonAll={ backgroundColor: '#0269fa' }
      }
    },
    //画趋势图
    EchartLien(result){
      this.tempDataX=[]
      this.tempDataS=[]
      this.tempDataSt=[]
      this.tempDataLo=[]
      this.tempDataCe=[]
      //清空数据
      this.option.series[0].data=[]
      this.option.series[1].data=[]
      this.option.series[2].data=[]
      this.option.series[3].data=[]

      //组合图线的数据
      for (let i = 0; i < result.data.length; i++) {
        this.tempDataX.push(result.data[i].testingDate)
        this.tempDataS.push(result.data[i].valueUse)
        this.tempDataSt.push(result.data[i].standard)
        this.tempDataCe.push(result.data[i].standard+result.data[i].ceiling)
        this.tempDataLo.push(result.data[i].standard+result.data[i].lower)
      }
      this.option.xAxis.data=this.tempDataX
      this.option.series[0].data=this.tempDataS
      this.option.series[1].data=this.tempDataSt
      this.option.series[2].data=this.tempDataCe
      this.option.series[3].data=this.tempDataLo
      //设定y轴的最小值
      this.option.yAxis.min=result.data[0].standard+result.data[0].lower*2
      this.option.yAxis.max=result.data[0].standard+result.data[0].ceiling*2
      //组合到配置项中
      this.chartUser.setOption(this.option);
    },
    //画直方图
    EchartBor(result){
      this.tempDataX=['1/10','2/10','3/10','4/10','5/10','6/10','7/10','8/10','9/10','10/10']
      this.optionBor.series[0].data=[]
      this.optionBor.xAxis.data=this.tempDataX
      // 设定变量值
      let valueTemp=[0,0,0,0,0,0,0,0,0,0]
      //下线最小值
      let Cls=result.data[0].standard+result.data[0].lower
      let cL=result.data[0].ceiling-result.data[0].lower
      for (let i = 0; i < result.data.length; i++) {
        if ( result.data[i].valueUse>=Cls && result.data[i].valueUse<Cls+cL/10){
          valueTemp[0]=valueTemp[0]+1
        }
        else if (result.data[i].valueUse>=Cls+cL/10 && result.data[i].valueUse<Cls+cL/10*2){
          valueTemp[1]=valueTemp[1]+1
        }
        else if (result.data[i].valueUse>=Cls+cL/10*2 && result.data[i].valueUse<Cls+cL/10*3){
          valueTemp[2]=valueTemp[2]+1
        }
        else if (result.data[i].valueUse>=Cls+cL/10*3 && result.data[i].valueUse<Cls+cL/10*4){
          valueTemp[3]=valueTemp[3]+1
        }
        else if (result.data[i].valueUse>=Cls+cL/10*4 && result.data[i].valueUse<Cls+cL/10*5){
          valueTemp[4]=valueTemp[4]+1
        }
        else if (result.data[i].valueUse>=Cls+cL/10*5 && result.data[i].valueUse<Cls+cL/10*6){
          valueTemp[5]=valueTemp[5]+1
        }
        else if (result.data[i].valueUse>=Cls+cL/10*6 && result.data[i].valueUse<Cls+cL/10*7){
          valueTemp[6]=valueTemp[6]+1
        }
        else if (result.data[i].valueUse>=Cls+cL/10*7 && result.data[i].valueUse<Cls+cL/10*8){
          valueTemp[7]=valueTemp[7]+1
        }
        else if (result.data[i].valueUse>=Cls+cL/10*8 && result.data[i].valueUse<Cls+cL/10*9){
          valueTemp[8]=valueTemp[8]+1
        }
        else if (result.data[i].valueUse>=Cls+cL/10*9 && result.data[i].valueUse<Cls+cL/10*10){
          valueTemp[9]=valueTemp[9]+1
        }
      }
      //设定y轴的最小值
      this.optionBor.series[0].data=valueTemp
      //组合到配置项中
      this.chartUserBor.setOption(this.optionBor);
    },
    //画移动极差图
    EchartLienMove(result){
      this.tempDataX=[]
      this.tempDataS=[]
      this.tempDataSt=[]
      this.tempDataLo=[]
      this.tempDataCe=[]

      this.optionLien.series[0].data=[]
      this.optionLien.series[1].data=[]
      this.optionLien.series[2].data=[]
      this.optionLien.series[3].data=[]

      //建立一个空的数据，是数组，记录移动极差。
      let tempZ
      for (let i = 0; i < result.data.length-1; i++) {
        this.tempDataX.push(result.data[i].testingDate)
        tempZ=result.data[i].valueUse-result.data[i+1].valueUse
        this.tempDataS.push(tempZ)
        this.tempDataCe.push(result.data[i].ceiling)
        this.tempDataLo.push(result.data[i].lower)
      }
      this.optionLien.xAxis.data=this.tempDataX
      this.optionLien.series[0].data=this.tempDataS
      this.optionLien.series[1].data=this.tempDataSt
      this.optionLien.series[2].data=this.tempDataCe
      this.optionLien.series[3].data=this.tempDataLo
      //设定y轴的最小值
      this.optionLien.yAxis.min=result.data[0].lower*2
      this.optionLien.yAxis.max=result.data[0].ceiling*2
      //组合到配置项中
      this.chartUserLien.setOption(this.optionLien);
    },
    //计算标准方差
    calculateStandardDeviation(array) {
      // 计算数组长度
      var n = array.length;

      // 计算数组的平均值
      var sum = array.reduce((a, b) => a + b, 0);
      var avg = sum / n;

      // 计算每个数与平均值的差的平方和
      var sumOfSquares = array.reduce((acc, val) => acc + Math.pow(val - avg, 2), 0);

      // 计算标准差 并返回

      return Math.sqrt(sumOfSquares / (n - 1));
    },
    //计算CPK
    calculateCpk(array, USL, LSL) {
      // 计算平均值和标准差
      const avg = array.reduce((a, b) => a + b, 0) / array.length;
      const stdDev=this.calculateStandardDeviation(array);

      // 计算Cpk
      const upperCapability = (USL - avg) / (3 * stdDev);
      const lowerCapability = (avg - LSL) / (3 * stdDev);
      return Math.min(upperCapability, lowerCapability);
    },
    //在趋势管理中，点击需要查看的项目的时候
    projectHandleRowClick(row) {
      if (this.languageS==='chinese'){
        this.option.title.text=row.project
      }
      else if (this.languageS==='english'){
        this.option.title.text=row.projectEnglish
      }
      else if (this.languageS==='russian'){
        this.option.title.text=row.projectRussian
      }
      //向后端发送请求，筛选数据
        this.tableDataTemp=row
        this.tableDataTemp.selectNum=this.selectNum

        //向后端发送请求，筛选出需要的组数据
        this.$request.post("/selectNum",this.tableDataTemp).then(result=>{
          //判断，如果登录异常，跳转到登录页面
          if (result.code === 401) {
            this.$router.push('UserLogin')
            alert("您未登录，请登录")
          }
          else {
            //给运算趋势的数据赋值，这个值也是后面编辑的值
            this.tableDataValueEdit=result.data
            if (this.chartUser) {
              this.chartUser.dispose()
            }
            if (this.chartUserBor){
              this.chartUserBor.dispose()
            }
            if (this.chartUserLien){
              this.chartUserLien.dispose()
            }
            // 画图用到的，画趋势图
            //清空数据
            this.option.series[0].data=[]
            this.option.series[1].data=[]
            this.option.series[2].data=[]
            this.option.series[3].data=[]
            this.chartUser= echarts.init(this.$refs.myChart)
            this.chartUser.setOption(this.option);
            //画直方图
            //清空数据
            this.optionBor.series[0].data=[]
            this.chartUserBor=echarts.init(this.$refs.myChartBor)
            this.chartUserBor.setOption(this.optionBor)
            //画移动极差图
            //清空数据
            this.optionLien.series[0].data=[]
            this.optionLien.series[1].data=[]
            this.optionLien.series[2].data=[]
            this.optionLien.series[3].data=[]

            this.chartUserLien=echarts.init(this.$refs.myChartLine)
            this.chartUserLien.setOption(this.optionLien)

            if (result.data.length>1){
              //画趋势图
              this.EchartLien(result)
              //画直方图
              this.EchartBor(result)
              //画移动极差图
              this.EchartLienMove(result)
              //计算过程能力CPK
              this.cpk=-this.calculateCpk(this.tempDataS,result.data[0].standard+result.data[0].ceiling,result.data[0].standard+result.data[0].lower).toFixed(2)
              //给数据赋值，用在数据维护页面
              this.tableDataValueEdit=result.data
            }
            this.trendSix()
          }
        })

    },
    //修改数据的弹窗
    testingEdit(scope,doe){
      this.useDoe=doe
      //执行修改检测日期的操作
      if (doe===1){
        this.valueDate=scope.row.testingDate
        this.dialogVisibleDate=true
        this.testingEditUseId=scope.row.id
        this.titleUse='修改检测日期'
        this.tableIndex=scope.$index
      }
      else if (doe===2){
        //执行修改工件号的操作
        this.inputName=scope.row.workpiece
        this.dialogVisibleName=true
        this.testingEditUseId=scope.row.id
        this.titleUse='修改检测工件号'
        this.tableIndex=scope.$index
      }
      else if (doe===3){
        //修改检测数据
        this.inputName=scope.row.valueUse
        this.dialogVisibleName=true
        this.testingEditUseId=scope.row.id
        this.titleUse='修改检测数据'
        this.tableIndex=scope.$index
      }
      else if (doe===4){
        //修改下公差带
        this.inputName=scope.row.lower
        this.dialogVisibleName=true
        this.testingEditUseId=scope.row.id
        this.titleUse='修改下公差'
        this.tableIndex=scope.$index
      }
      else if (doe===5){
        //修改上公差带
        this.inputName=scope.row.ceiling
        this.dialogVisibleName=true
        this.testingEditUseId=scope.row.id
        this.titleUse='修改上公差'
        this.tableIndex=scope.$index
      }
    },
    //修改数据，向后端传递的函数（文本日期类）
    saveJavaDate(idUse,field,val){
      //需要把数据处理，处理为yyyy-mm-dd格式的日期
      const date = new Date(val);
      const year = date.getFullYear().toString().padStart(4, '0');
      const month = (date.getMonth() + 1).toString().padStart(2, '0'); // 月份从0开始，所以需要+1
      const day = date.getDate().toString().padStart(2, '0');
      val=`${year}-${month}-${day}`

      this.$request.post('/testingEditStr',{idUse,field,val}).then(result=>{
        if (result.code === 401){
          this.$router.push('UserLogin')
          alert("您未登录，请登录")
        }else {
          alert("保存成功")
          if (this.tableIndex!==-1){
            //修改数据，修正页中的列表中的数据
            this.tableDataValueEdit[this.tableIndex][field]=val
            //修改数据，总表的数据
          }else {
            alert("程序有误，请联系管理员")
          }
        }
      })
    },
    //修改数据，向后端传递的函数（文本内容类）
    saveJava(idUse,field,val){
      this.$request.post('/testingEditStr',{idUse,field,val}).then(result=>{
        if (result.code === 401){
          this.$router.push('UserLogin')
          alert("您未登录，请登录")
        }else {
          alert("保存成功")
          if (this.tableIndex !== -1) {
            //修改数据，修正页中的列表中的数据
            this.tableDataValueEdit[this.tableIndex][field] = val
            //修改数据，总表的数据
          } else {
            alert("程序有误，请联系管理员")
          }
        }
      })
    },
    //修改数据，向后端传递的函数（数字内容类）
    saveJavaNmb(idUse,field,val){
        this.$request.post('/testingEditNmb',{idUse,field,val}).then(result=>{
          if (result.code === 401){
            this.$router.push('UserLogin')
            alert("您未登录，请登录")
          }else {
            alert("保存成功")
            if (this.tableIndex !== -1) {
              //修改数据，修正页中的列表中的数据
              this.tableDataValueEdit[this.tableIndex][field] = val
              //修改数据，总表的数据
            } else {
              alert("程序有误，请联系管理员")
            }
          }
        })
    },
    //点击弹窗确定，向后端传递数据进行修改，用在数据管理页上的
    saveTestingEdit(){
      //修改检测日期的操作
      if (this.useDoe===1){
        this.saveJavaDate(this.testingEditUseId,'testingDate',this.valueDate)
        this.dialogVisibleDate=false
      }
      //修改工件号的操作
      else if (this.useDoe===2){
        this.saveJava(this.testingEditUseId,'workpiece',this.inputName)
        this.dialogVisibleName=false
      }
      //修改检测数据
      else if (this.useDoe===3){
        //校验数据
        let regex = /^[-+]?\d*(\.\d+)?$/
        if (!regex.test(this.inputName)){
          alert("请输入数字")
        }else {
          this.saveJavaNmb(this.testingEditUseId,'valueUse',this.inputName)
          this.dialogVisibleName=false
        }
      }
      //修改下公差带
      else if (this.useDoe===4){
        //校验数据
        let regex = /^[-+]?\d*(\.\d+)?$/
        if (!regex.test(this.inputName)){
          alert("请输入数字")
        }else {
          this.saveJavaNmb(this.testingEditUseId, 'lower', this.inputName)
          this.dialogVisibleName = false
        }
      }
      //修改上公差带
      else if (this.useDoe===5){
        //校验数据
        let regex = /^[-+]?\d*(\.\d+)?$/
        if (!regex.test(this.inputName)){
          alert("请输入数字")
        }else {
          this.saveJavaNmb(this.testingEditUseId, 'ceiling', this.inputName)
          this.dialogVisibleName = false
        }
      }
    },
    //查询用户信息的函数
    inquiry(){
      //输入用户编号，向后端查询信息
      const useId=localStorage.getItem('userName').replace(/"/g, '');
      this.$request.post('/useQueryPower',{
        queryFiledName:'controlTesting',
        userId:useId,
      }).then(result=>{
        if (result.code === 401) {
          this.$router.push('UserLogin')
          alert("您未登录，请登录")
        }else {
          this.useName=result.data.name
          this.usePower=result.data.controlTesting
          this.useId=useId
        }
      })
    },
    //辅助函数：辅助做提示信息滚动的函数
    suggestAiRoll(){

    },
    //辅助函数；计算是否有联系6点上升或者下降的情况;numb:代表在多少个数据中计算
    trendSix(numb){
      console.log('函数中',this.tableDataValueEdit)
      //计算6个点连续上升情况

      for (let i = this.tableDataValueEdit-numb; i < this.tableDataValueEdit.length-6; i++) {
        let upSix=0;
        for (let j = i; j <i+5; j++) {
          if (this.tableDataValueEdit[i]>this.tableDataValueEdit[i+1]){
            //计数器增加；
            upSix=upSix+1
          }
          else {
            //上升规律已经打破，前面的可以跳过，给i增加上计数值；
            i=i+upSix
            //计数器归零
            upSix=0;
            //跳出本次循环
            break
          }
          //如果计数达到5，表明已经出现了连续6点上升情况，进行记录，记录到连续上升数组中
          if (upSix===5){
            for (let k = j-6; k <j; k++) {
              this.riseSix.push(this.tableDataValueEdit[k])
            }
          }
        }
      }
    },
    //用户点击的是看图片还是看视频，进行元素的切换
    videoAndImage(doe){
      if (doe===1){
        // 用户要看图像
        this.editVideoAndImageUse=1;
        this.videoAndImage1='#0269fa'
        this.videoAndImageColor1='white'

        this.videoAndImage2='white'
        this.videoAndImageColor2=''
      }
      else if (doe===2){
        // 用户要看视频
        this.editVideoAndImageUse=2;
        this.videoAndImage2='#0269fa'
        this.videoAndImageColor2='white'

        this.videoAndImage1='white'
        this.videoAndImageColor1=''
      }
    },
    //在作业指导书的页面中，用户点击的是看作业指导书中的那个数据，表头的上面的列表切换。
    workBookHeard(doe){
      this.workBookHeardUse=doe
      if (doe===1){
        this.workBookHeard1='#0269fa'
        this.workBookHeardColour1='white'

        this.workBookHeard2=''
        this.workBookHeardColour2=''

        this.workBookHeard3=''
        this.workBookHeardColour3=''

        this.workBookHeard4=''
        this.workBookHeardColour4=''
      }
      else if (doe===2){
        this.workBookHeard1=''
        this.workBookHeardColour1=''

        this.workBookHeard2='#0269fa'
        this.workBookHeardColour2='white'

        this.workBookHeard3=''
        this.workBookHeardColour3=''

        this.workBookHeard4=''
        this.workBookHeardColour4=''
      }
      else if (doe===3){
        this.workBookHeard1=''
        this.workBookHeardColour1=''

        this.workBookHeard2=''
        this.workBookHeardColour2=''

        this.workBookHeard3='#0269fa'
        this.workBookHeardColour3='white'

        this.workBookHeard4=''
        this.workBookHeardColour4=''
      }
      else if (doe===4){
        this.workBookHeard1=''
        this.workBookHeardColour1=''

        this.workBookHeard2=''
        this.workBookHeardColour2=''

        this.workBookHeard3=''
        this.workBookHeardColour3=''

        this.workBookHeard4='#0269fa'
        this.workBookHeardColour4='white'
      }
    },
    //在作业指导书分页上，点击检测项目，展现作业指导书内容
    labelDataWorkBookRowClick(scope){
      //清空控制计划的内容
      this.tableDataControl=[]
        //现在是主表上的点击
        //把点击击的单元格范围数据发送出去
        this.tableDataScope=scope
        //把数据赋值给临时的数据
        this.tableDataTemp=_.cloneDeep(scope.row)
        //组合作业指导书的内容
        //把数据进行分割,分割出步骤一条一条的。
        const temp=this.tableDataTemp.workBook.split('|-|')
        // 对每一条的数据进行处理
        this.workBook=[]
        for (let i = 0; i < temp.length-1; i++) {
          //对数据进行分割
          const time=temp[i].split('|%|')
          // 组合数据
          const timeTemp={
            id:0,
            work:time[0],//工作项目
            problem:time[1],//关注点
            inspect:time[2],//品质检查
            spendTime:time[3],//需要的时间
            controlPlan:time[4],//控制计划的关联项
            toll:time[5],//工具
            device:time[7],//设备
            accessories:time[6],//辅料,
            pictureList:time[8],//图片地址列表
            videoList:time[9],//视频地址列表
          }
          this.workBook.push(timeTemp)
        }
        //向后端查询控制计划的内容
      this.$request.get('queryControlPlanControlTesting?id='+this.tableDataScope.row.controlTesting).then(result=>{
            if (result.code === 401) {
              this.$router.push('UserLogin')
              alert("您未登录，请登录")
            }
            else {
              if (result.data.length===0){
                this.tableDataControl=[]
              }else {
                this.tableDataControl.push(result.data)
                console.log(result.data)
              }
            }
      })
    },
    //对作业指导书操作，添加、编辑、删除，控制计划的关联设置等，所有的作业指导书编辑部分的函数
    editBook(doe,scope){
      //把用户现在的类型传递出去，1：编辑作业指导书；2.增加一个作业指导书的步骤；3.删除作业指导书；4.增加这个条目下的图片；
      this.editBookUse=doe
      //把用户选择的作业指导书的scope格式传递出去。
      this.editBookScope=scope
      //是编辑操作
        if (this.editBookUse===1){
          //进行初始赋值
          this.titleUse='您正在编辑本条步骤'
          this.inputText1=_.cloneDeep(this.editBookScope.row.work)
          this.inputText2=_.cloneDeep(this.editBookScope.row.problem)
          this.inputText3=_.cloneDeep(this.editBookScope.row.inspect)
          this.inputText4=_.cloneDeep(this.editBookScope.row.device)
          this.inputText5=_.cloneDeep(this.editBookScope.row.accessories)
          this.inputText6=_.cloneDeep(this.editBookScope.row.toll)
          this.inputNum=_.cloneDeep(this.editBookScope.row.spendTime)
          this.dialogVisibleText=true
        }
        //是一向下插入操作
        else if (this.editBookUse===2){
          //初始化数据
          this.titleUse='您正在向下插入一个新的步骤'
          this.inputText1=''
          this.inputText2=''
          this.inputText3=''
          this.inputText4=''
          this.inputText5=''
          this.inputText6=''
          this.inputNum=0
          this.dialogVisibleText=true
        }
        //是删除操作
        else if (this.editBookUse===3){
          //进行初始赋值
          this.titleUse='您正在删除本条步骤'
          this.inputText1=_.cloneDeep(this.editBookScope.row.work)
          this.inputText2=_.cloneDeep(this.editBookScope.row.problem)
          this.inputText3=_.cloneDeep(this.editBookScope.row.inspect)
          this.inputText4=_.cloneDeep(this.editBookScope.row.device)
          this.inputText5=_.cloneDeep(this.editBookScope.row.accessories)
          this.inputText6=_.cloneDeep(this.editBookScope.row.toll)
          this.inputNum=_.cloneDeep(this.editBookScope.row.spendTime)
          this.dialogVisibleText=true
        }
        //是编辑照片的操作，包括添加、删除。
        else if (this.editBookUse===4){
          //是编辑照片的操作，包括添加、删除。
          //组合图片编辑列表的数据
          //组合照片的数据
          if (this.editBookScope.row.pictureList.includes('undefined')){
            //没有图片信息
            this.PictureList = []
          }
          else {
            this.PictureList = []
            const temp1 = this.editBookScope.row.pictureList.split('|*|')
            for (let i = 0; i < temp1.length - 1; i++) {
              let temp2 = {
                name: temp1[i],
                percentage: 0,
                raw: File,
                size: 0,
                status: null,
                uid: null,
                url: filepath + temp1[i]
              }
              this.PictureList.push(temp2)
            }
          }
          this.titleUse='您正在编辑本行的图片信息'
          this.fileType='image/jpeg, image/png'
          this.dialogPicture=true
        }
        //在装配作业指导书中编辑视频操作，包括添加、删除。
        else if (this.editBookUse===5){
          //组合视频编辑列表的数据
          //组合视频的数据
          if (this.editBookScope.row.videoList.includes('undefined')){
            //没有视频信息
            this.videoList = []
          }
          else {
            this.videoList = []
            const temp1 = this.editBookScope.row.videoList.split('|*|')
            for (let i = 0; i < temp1.length - 1; i++) {
              let temp2 = {
                name: temp1[i],
                percentage: 0,
                raw: File,
                size: 0,
                status: null,
                uid: null,
                url: filepath + temp1[i]
              }
              this.videoList.push(temp2)
            }
          }
          this.fileType='video/mp4, video/x-matroska, video/quicktime, video/webm'
          this.titleUse='您正在编辑本行的视频信息'
          this.dialogVideo=true
        }
        //点击的是编辑控制计划内容，关联控制计划的编辑页。
        else if (this.editBookUse===6){
          this.titleUse='编辑控制计划管理项目'
          this.controlPlanSelection=[]
          this.tableDataControl=[]
          this.dialogVisibleControl=true
        }
        //需要查看作业指导的图片\视频，没有其他的编辑内容,是组合走马灯照片或者视频的
        //组合走马灯的照片、视频
        else if (this.editBookUse===100){
          if (this.editBookScope.row.pictureList.includes('undefined')){
            this.itemView=[]
          }
          else {
            let pictureTemp=this.editBookScope.row.pictureList.split('|*|')
            this.itemView=[]
            for (let i = 0; i < pictureTemp.length-1; i++) {
              let temp=filepath+pictureTemp[i]
              this.itemView.push(temp)
            }
          }
          //组合走马灯的视频
          if (this.editBookScope.row.videoList.includes('undefined')){
            this.itemViewVideo=[]
          }
          else {
            let pictureTemp=this.editBookScope.row.videoList.split('|*|')
            this.itemViewVideo=[]
            for (let i = 0; i < pictureTemp.length-1; i++) {
              let temp=filepath+pictureTemp[i]
              this.itemViewVideo.push(temp)
            }
          }
        }


    },
    //作业指导书中的“确定”按钮点击后的保存函数
    saveDataWorkBook(){
      //是编辑操作
        if (this.editBookUse===1){
          if (this.inputNum===0){
            alert("本工步无时间，请核对")
            return
          }
          //是当前作业指导书下的修改某一个条目的操作
          if (this.inputText1===''){
            this.inputText1='作业指导书步骤|*|Steps of homework instruction manual|*|Этапы руководства по оперативной деятельности'
          }
          if (this.inputText2===''){
            this.inputText2='作业关注点|*|Homework focus points|*|Приоритеты домашних заданий'
          }
          if (this.inputText3===''){
            this.inputText3='品质检查|*|Quality Inspection|*|Контроль качества'
          }
          if (this.inputText4===''){
            this.inputText4='设备|*|device|*|Оборудование'
          }
          if (this.inputText5===''){
            this.inputText5='辅料|*|accessories|*|Вспомогательные материалы'
          }
          if (this.inputText6===''){
            this.inputText6='工具|*|tool|*|Инструменты'
          }

          //组合数据
          //向总数据中进行组合
          let temp=_.cloneDeep(this.workBook)
          temp[this.editBookScope.$index].work=this.inputText1
          temp[this.editBookScope.$index].problem=this.inputText2
          temp[this.editBookScope.$index].inspect=this.inputText3
          temp[this.editBookScope.$index].device=this.inputText4
          temp[this.editBookScope.$index].accessories=this.inputText5
          temp[this.editBookScope.$index].toll=this.inputText6
          temp[this.editBookScope.$index].spendTime=this.inputNum
          temp[this.editBookScope.$index].controlPlan=this.tableDataScope.row.controlTesting
          //组合成为文本数据，用的方法是，先把每一条的数据组合起来。
          let strTemp=''//组合的临时变量,用在向后端保存数据的变量
          for (let i = 0; i < temp.length; i++) {
            //组合自己每一条的变量
            let itemStr=temp[i].work+'|%|'+temp[i].problem+'|%|'+temp[i].inspect+'|%|'+temp[i].spendTime
                +'|%|'+temp[i].controlPlan+'|%|'+temp[i].toll+'|%|'+temp[i].accessories+'|%|'+temp[i].device
                +'|%|'+temp[i].pictureList+'|%|'+temp[i].videoList+'|%|'
            strTemp=strTemp+itemStr+'|-|'
          }
          //向后端发动数据，进行保存
          this.editOneFiledByControlTestingNew(this.tableDataScope.row.id,'workBook',strTemp)
        }
        //是向下插入操作
        else if (this.editBookUse===2){
          if (this.inputNum===0){
            alert("本工步无时间，请核对")
            return
          }
          if (this.inputText1===''){
            this.inputText1='作业指导书步骤|*|Steps of homework instruction manual|*|Этапы руководства по оперативной деятельности'
          }
          if (this.inputText2===''){
            this.inputText2='作业关注点|*|Homework focus points|*|Приоритеты домашних заданий'
          }
          if (this.inputText3===''){
            this.inputText3='品质检查|*|Quality Inspection|*|Контроль качества'
          }
          if (this.inputText4===''){
            this.inputText4='设备|*|device|*|Оборудование'
          }
          if (this.inputText5===''){
            this.inputText5='辅料|*|accessories|*|Вспомогательные материалы'
          }
          if (this.inputText6===''){
            this.inputText6='工具|*|tool|*|Инструменты'
          }
          //组合数据
          //向总数据中进行组合
          const workBookTemp={
            id:-1,
            work:this.inputText1,//工作项目
            problem:this.inputText2,//关注点
            inspect:this.inputText3,//品质检查
            spendTime: this.inputNum,//用时，单位S
            controlPlan:this.tableDataScope.row.controlTesting,//控制计划的关联项
            toll:this.inputText6,//工具
            device:this.inputText4,//设备
            accessories:this.inputText5,//辅料,
            pictureList:'undefined|*|'//图片列表
          }
          //拷贝数据
          let temp=_.cloneDeep(this.workBook)
          //插入数据
          temp.splice(this.editBookScope.$index+1,0,workBookTemp)
          //组合成为文本数据，用的方法是，先把每一条的数据组合起来。
          let strTemp=''//组合的临时变量,用在向后端保存数据的变量
          for (let i = 0; i < temp.length; i++) {
            //组合自己每一条的变量
            let itemStr=temp[i].work+'|%|'+temp[i].problem+'|%|'+temp[i].inspect+'|%|'+temp[i].spendTime
                +'|%|'+temp[i].controlPlan+'|%|'+temp[i].toll+'|%|'+temp[i].accessories+'|%|'+temp[i].device
                +'|%|'+temp[i].pictureList+'|%|'+temp[i].videoList+'|%|'
            strTemp=strTemp+itemStr+'|-|'
          }
          //向后端发动数据，进行保存
          this.editOneFiledByControlTestingNew(this.tableDataScope.row.id,'workBook',strTemp)
        }
        //是删除操作
        else if (this.editBookUse===3){
          //组合数据
          //向总数据中进行组合
          //拷贝数据
          let temp=_.cloneDeep(this.workBook)
          //插入数据
          temp.splice(this.editBookScope.$index,1)
          //组合成为文本数据，用的方法是，先把每一条的数据组合起来。
          let strTemp=''//组合的临时变量,用在向后端保存数据的变量
          for (let i = 0; i < temp.length; i++) {
            //组合自己每一条的变量
            let itemStr=temp[i].work+'|%|'+temp[i].problem+'|%|'+temp[i].inspect+'|%|'+temp[i].spendTime
                +'|%|'+temp[i].controlPlan+'|%|'+temp[i].toll+'|%|'+temp[i].accessories+'|%|'+temp[i].device
                +'|%|'+temp[i].pictureList+'|%|'+temp[i].videoList+'|%|'
            strTemp=strTemp+itemStr+'|-|'
          }
          //向后端发动数据，进行保存
          this.editOneFiledByControlTestingNew(this.tableDataScope.row.id,'workBook',strTemp)
        }

    },
    //单击走马灯上的照片，图片放大方法
    handleImageClick(item){
      this.dialogImageUrl=item
      this.dialogPictureAnnex=true
    },
    //辅助函数：修改测量基准表中的某一个字符串字段的函数，现在用在了修改作业指导书的内容中
    editOneFiledByControlTestingNew(id,field,val){
      //向后端传递数据
      this.$request.post('/editOneFiledByControlTestingNew',{
        id:id,
        field:field,
        val:val
      }).then(result=>{
        if (result.code === 401) {
          this.$router.push('UserLogin')
          alert("您未登录，请登录")
        }
        else {
          this.dialogVisibleText=false
          //对新数据进行重新赋值
          this.tableData[this.tableDataScope.$index].workBook=result.data
          //把数据赋值给临时的数据
          this.tableDataTemp=_.cloneDeep(this.tableData[this.tableDataScope.$index])
          //重新组合数据
          //组合作业指导书的内容
          //把数据进行分割,分割出步骤一条一条的。
          const temp=this.tableDataTemp.workBook.split('|-|')
          // 对每一条的数据进行处理
          this.workBook=[]
          for (let i = 0; i < temp.length-1; i++) {
            //对数据进行分割
            const time=temp[i].split('|%|')
            // 组合数据
            const timeTemp={
              id:0,
              work:time[0],//工作项目
              problem:time[1],//关注点
              inspect:time[2],//品质检查
              spendTime:time[3],//需要的时间
              controlPlan:time[4],//控制计划的关联项
              toll:time[5],//工具
              device:time[7],//设备
              accessories:time[6],//辅料,
              pictureList:time[8],//图片列表数据
              videoList:time[9],//视频列表数据
            }

            this.workBook.push(timeTemp)
          }
        }
      })
    },
    //上传文件的函数(上传图片）
    saveFileAnnex(file, fileList){
      console.log(fileList)
      //是对图片的操作
        if (this.editBookUse===4){
          const formData = new FormData()
          //1.新生成一个文件名称,并且把文件名称的后缀添加上
          let fileName=this.generateUniqueId()+'.'+file.name.split('.')[file.name.split('.').length-1]
          //2.记录一个新的图片名称
          let pictureName=''
          //把文件数据放进去
          file.name=fileName
          //把图片加入到自己的图片列表中，好像没有用
          this.PictureList.push(file)
          formData.append('file', file.raw)
          //把原来的图片字符串放进去，作为修改用
          //把数据整合到作业指导书的内容中
          //先判断原来的数据是否有图片
          if (this.editBookScope.row.pictureList.includes('undefined')){
            //原来没有图片，需要现在全新生成
            pictureName=fileName+'|*|'
          }
          else {
            //原来已经有图片了
            pictureName=this.editBookScope.row.pictureList+fileName+'|*|'
          }
          //重新组合作业指导书的文本内容。
          //组合数据
          //向总数据中进行组合
          let temp=_.cloneDeep(this.workBook)
          //把新的图片字符串赋值
          temp[this.editBookScope.$index].pictureList=pictureName
          //组合成为文本数据，用的方法是，先把每一条的数据组合起来。
          let strTemp=''//组合的临时变量,用在向后端保存数据的变量
          for (let i = 0; i < temp.length; i++) {
            //组合自己每一条的变量
            let itemStr=temp[i].work+'|%|'+temp[i].problem+'|%|'+temp[i].inspect+'|%|'+temp[i].spendTime
                +'|%|'+temp[i].controlPlan+'|%|'+temp[i].toll+'|%|'+temp[i].accessories+'|%|'+temp[i].device
                +'|%|'+temp[i].pictureList+'|%|'+temp[i].videoList+'|%|'
            strTemp=strTemp+itemStr+'|-|'
          }
          formData.append('id',this.tableDataScope.row.id)
          formData.append('fieldName','workBook')
          formData.append('fieldVal',strTemp)
          formData.append('fileName',fileName)
          // 保存文件，需要返回修改后的图片地址保存数据，并且进行赋值
          this.$requestFile.post('/addPictureControlTesting',formData).
          then(result=>{
            if (result.code === 401) {
              this.$router.push('UserLogin')
              alert("您未登录，请登录")
            }else {
              if (result.data===null){
                alert("程序出现异常，请联系管理员")
              }else {
                //修改列表中的数据
                //修改主表中的数据和记录的保存数据
                this.tableData[this.tableDataScope.$index].workBook=result.data
                this.tableDataScope.row.workBook=result.data
                //修改作业指导书列表中的内容
                this.workBook[this.editBookScope.$index].pictureList=pictureName
                //组合走马灯的照片
                let pictureTemp=pictureName.split('|*|')
                this.itemView=[]
                for (let i = 0; i < pictureTemp.length-1; i++) {
                  let temp=filepath+pictureTemp[i]
                  this.itemView.push(temp)
                }
              }
            }
          })
        }
        else if (this.editBookUse===5){
          //是编辑视频
          const formData = new FormData()
          //1.新生成一个文件名称,并且把文件名称的后缀添加上
          let fileName=this.generateUniqueId()+'.'+file.name.split('.')[file.name.split('.').length-1]
          //2.记录一个新的视频名称
          let pictureName=''
          //把文件数据放进去（新的文件名称
          file.name=fileName
          //把图片加入到自己的图片列表中，好像没有用
          this.videoList.push(file)
          formData.append('file', file.raw)
          //把原来的视频字符串放进去，作为修改用
          //把数据整合到作业指导书的内容中
          //先判断原来的数据是否有视频
          if (this.editBookScope.row.videoList.includes('undefined')){
            //原来没有图片，需要现在全新生成
            pictureName=fileName+'|*|'
          }
          else {
            //原来已经有视频了
            pictureName=this.editBookScope.row.videoList+fileName+'|*|'
          }
          //重新组合作业指导书的文本内容。
          //组合数据
          //向总数据中进行组合
          let temp=_.cloneDeep(this.workBook)
          //把新的视频字符串赋值
          temp[this.editBookScope.$index].videoList=pictureName
          //组合成为文本数据，用的方法是，先把每一条的数据组合起来。
          let strTemp=''//组合的临时变量,用在向后端保存数据的变量
          for (let i = 0; i < temp.length; i++) {
            //组合自己每一条的变量
            let itemStr=temp[i].work+'|%|'+temp[i].problem+'|%|'+temp[i].inspect+'|%|'+temp[i].spendTime
                +'|%|'+temp[i].controlPlan+'|%|'+temp[i].toll+'|%|'+temp[i].accessories+'|%|'+temp[i].device
                +'|%|'+temp[i].pictureList+'|%|'+temp[i].videoList+'|%|'
            strTemp=strTemp+itemStr+'|-|'
          }
          formData.append('id',this.tableDataScope.row.id)
          formData.append('fieldName','workBook')
          formData.append('fieldVal',strTemp)
          formData.append('fileName',fileName)
          console.log(strTemp)
          console.log(formData)
          // 保存文件，需要返回修改后的图片地址保存数据，并且进行赋值
          this.$requestFile.post('/addPictureControlTesting',formData).
          then(result=>{
            if (result.code === 401) {
              this.$router.push('UserLogin')
              alert("您未登录，请登录")
            }else {
              if (result.data===null){
                alert("程序出现异常，请联系管理员")
              }else {
                //修改列表中的数据
                //修改主表中的数据和记录的保存数据
                this.tableData[this.tableDataScope.$index].workBook=result.data
                this.tableDataScope.row.workBook=result.data
                //修改作业指导书列表中的内容
                this.workBook[this.editBookScope.$index].videoList=pictureName
                //组合视频走马灯的视频
                let videoTemp=pictureName.split('|*|')
                this.itemViewVideo=[]
                for (let i = 0; i < videoTemp.length-1; i++) {
                  let temp=filepath+videoTemp[i]
                  this.videoList.push(temp)
                  this.itemViewVideo.push(temp)
                }
              }
            }
          })
        }

    },
    //点击查看照片的函数
    handlePictureCardPreview(file) {
      this.dialogImageUrl = file.url;
      this.dialogPictureAnnex = true;
    },
    //点击图片、视频下载按钮
    handleDownload(file) {
      //向后端发送请求，下载文件
      this.$request.get('/controlTestingDownload?fileName=' + encodeURIComponent(file.name)).then(result=>{
        if (result.code === 401) {
          this.$router.push('UserLogin')
          alert("您未登录，请登录")
        }
        else {
          let base64Data = 'data:application/octet-stream;base64,' + result.data//
          // 创建一个Blob对象
          let blob = this.dataURItoBlob(base64Data);
          // 触发下载
          this.downloadBlob(blob, file.name);
        }
      }).catch(error => {
        // 处理请求错误
        console.error("请求出错", error);
      })
    },
    //照片移除的函数
    handleRemove(file) {
        //是删除图片的函数
        if (this.editBookUse===4){
          //是装配作业指导书中的图片
          //对图片列表中的信息进行整合
          const index = this.PictureList.findIndex(item => item.name === file.name);
          this.PictureList.splice(index,1)
          //重新组合作业指导书的文本内容。
          //组合数据
          //向总数据中进行组合
          let temp=_.cloneDeep(this.workBook)
          //把新的图片字符串赋值
          temp[this.editBookScope.$index].pictureList=this.editBookScope.row.pictureList.replace(file.name+'|*|','')
          //判断一下，是不是删除后为空了，如果是，就设置为undefined
          if (temp[this.editBookScope.$index].pictureList===''){
            temp[this.editBookScope.$index].pictureList='undefined|*|'
          }
          //组合成为作业指导书的文本数据，用的方法是，先把每一条的数据组合起来。
          let strTemp=''//组合的临时变量,用在向后端保存数据的变量
          for (let i = 0; i < temp.length; i++) {
            //组合自己每一条的变量
            let itemStr=temp[i].work+'|%|'+temp[i].problem+'|%|'+temp[i].inspect+'|%|'+temp[i].spendTime
                +'|%|'+temp[i].controlPlan+'|%|'+temp[i].toll+'|%|'+temp[i].accessories+'|%|'+temp[i].device
                +'|%|'+temp[i].pictureList+'|%|'+temp[i].videoList+'|%|'
            strTemp=strTemp+itemStr+'|-|'
          }
          // 发送请求，执行删除文件，发送的是这一行的id，记录图片地址的字符串，以及需要修改的字段，为了减少后端的写的代码，重新返回新的文件名的序列内容，并且更新。
          this.$request.post('/controlTestPictureRemove',{
            id:this.tableDataScope.row.id,
            fieldName:'workBook',
            filedVal:strTemp,
            pictureName:file.name
          }).
          then(result=>{
            if (result.code === 401) {
              this.$router.push('UserLogin')
              alert("您未登录，请登录")
            }
            else {
              if (result.data==='删除文件时出错'){
                alert("删除文件出错，请联系管理员")
              }else {
                //修改列表中的数据
                //修改主表中的数据和记录的保存数据
                this.tableData[this.tableDataScope.$index].workBook=result.data
                this.tableDataScope.row.workBook=result.data
                //组合走马灯的照片
                if (temp[this.editBookScope.$index].pictureList.includes('undefined')){
                  this.itemView=[]
                }
                else {
                  this.itemView=[]
                  let tempView=temp[this.editBookScope.$index].pictureList.split('|*|')
                  for (let i = 0; i < tempView.length-1; i++) {
                    this.itemView.push(filepath+tempView[i])
                  }
                }
              }
            }
          })
        }
        else if (this.editBookUse===5){
          //是装配作业指导书的视频
          //对视频列表中的信息进行整合
          const index = this.videoList.findIndex(item => item.name === file.name);
          this.videoList.splice(index,1)
          //重新组合作业指导书的文本内容。
          //组合数据
          //向总数据中进行组合
          let temp=_.cloneDeep(this.workBook)
          //把新的图片字符串赋值
          temp[this.editBookScope.$index].videoList=this.editBookScope.row.videoList.replace(file.name+'|*|','')
          //判断一下，是不是删除后为空了，如果是，就设置为undefined
          if (temp[this.editBookScope.$index].videoList===''){
            temp[this.editBookScope.$index].videoList='undefined|*|'
          }
          //组合成为作业指导书的文本数据，用的方法是，先把每一条的数据组合起来。
          let strTemp=''//组合的临时变量,用在向后端保存数据的变量
          for (let i = 0; i < temp.length; i++) {
            //组合自己每一条的变量
            let itemStr=temp[i].work+'|%|'+temp[i].problem+'|%|'+temp[i].inspect+'|%|'+temp[i].spendTime
                +'|%|'+temp[i].controlPlan+'|%|'+temp[i].toll+'|%|'+temp[i].accessories+'|%|'+temp[i].device
                +'|%|'+temp[i].pictureList+'|%|'+temp[i].videoList+'|%|'
            strTemp=strTemp+itemStr+'|-|'
          }
          // 发送请求，执行删除文件，发送的是这一行的id，记录图片地址的字符串，以及需要修改的字段，为了减少后端的写的代码，重新返回新的文件名的序列内容，并且更新。

          this.$request.post('/controlTestPictureRemove',{
            id:this.tableDataScope.row.id,
            fieldName:'workBook',
            filedVal:strTemp,
            pictureName:file.name
          }).
          then(result=>{
            if (result.code === 401) {
              this.$router.push('UserLogin')
              alert("您未登录，请登录")
            }
            else {
              if (result.data==='删除文件时出错'){
                alert("删除文件出错，请联系管理员")
              }else {
                //修改列表中的数据
                //修改主表中的数据和记录的保存数据
                this.tableData[this.tableDataScope.$index].workBook=result.data
                this.tableDataScope.row.workBook=result.data
                //组合走马灯的视频
                if (temp[this.editBookScope.$index].pictureList.includes('undefined')){
                  this.itemViewVideo=[]
                }
                else {
                  this.videoList=[]
                  this.itemViewVideo=[]
                  let tempView=temp[this.editBookScope.$index].pictureList.split('|*|')
                  for (let i = 0; i < tempView.length-1; i++) {
                    this.videoList.push(filepath+tempView[i])
                    this.itemViewVideo.push(filepath+tempView[i])
                  }
                }
              }
            }
          })
        }

    },
    //辅助函数：生产唯一的文件标识码（利用时间戳和随机数）
    generateUniqueId() {
      return Date.now().toString() + Math.random().toString(36).slice(2, 11);
    },
    //辅助函数，下载文件
    dataURItoBlob(dataURI) {
      // 分离出头部信息,得到数据部分
      let byteString;
      if (dataURI.split(',')[0].indexOf('base64') >= 0)
        byteString = atob(dataURI.split(',')[1]);
      else
        byteString = unescape(dataURI.split(',')[1]);

      // 写入数组缓冲区
      let mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
      let ia = new Uint8Array(byteString.length);
      for (let i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
      }
      return new Blob([ia], {type:mimeString});
    },
    // 辅助函数：触发Blob对象的下载
    downloadBlob(blob, fileName) {
      let link = document.createElement('a');
      link.href = window.URL.createObjectURL(blob);
      link.download = fileName;
      link.click();
      window.URL.revokeObjectURL(link.href);
    },
    //点击维护产量按钮时候，开始准备弹窗，弹出的是一个对生产倒序排布，并且是分页展示的生产数据列表
    async assProductionClick() {
      //弹窗打开
      this.productionDialog = true
      //向后端调用数据，根据分页显示的数据默认在第一页，首先筛选出一共有多少条
      this.$request.get('basisQueryAllNumAssProduction').then(result => {
        this.totalPage = result.data
      })
      //向后端查询数据，并在页面上展示
      this.assProduction = await this.paginationQueryAssProduction(100, 1)
      //设置标题
      this.titleUse = '产量统计'
    },
    //分页用到的函数，当每页条数改变时
    async handleSizeChange(val) {
      //变化，并且向后端查询数据
      this.sizeChangeProduction = val
      this.assProduction = await this.paginationQueryAssProduction(val, this.currentChangeProduction)
    },
    //分页用到的函数，当前页改变时
    async handleCurrentChange(val) {
      this.currentChangeProduction = val
      this.assProduction = await this.paginationQueryAssProduction(this.sizeChangeProduction, val)
    },
    //点击对日生产量的插入、编辑、删除的操作
    productionClick(doe,scope){
      //打开编辑弹窗
      this.assProductionDoe=doe
      this.assProductionScope=scope
      //数据初始化,是新建
      if (doe===1){
        this.assProductionFrom={
          //主键
          id:'',
          //日期
          dateUse:this.nowDate(),
          //装配EB05生产量
          assEb05:0,
          //装配EB35生产量
          assEb35:0,
          //装配EB75生产量
          assEb75:0,
          //装配EN19生产量
          assEn19:0,
          //装配EN38生产量
          assEn38:0,
          //删除标记位
          deleteSign:1,
          //创建时间
          establishTime:'',
          //修改时间
          updateTime:'',
          //编辑人姓名
          editName:'',
        }
        this.titleUse1='您正在插入一条产量信息'
        this.productionEditDialog=true
      }
      //数据初始化,是编辑
      if (doe===2){
        this.assProductionFrom=_.cloneDeep(scope.row)
        this.titleUse1='您正在编辑一条产量信息'
        this.productionEditDialog=true
      }
      //数据初始化，是删除
      if (doe===3){
        this.assProductionFrom=_.cloneDeep(scope.row)
        this.titleUse1='您正在删除一条产量信息'
        this.productionEditDialog=true
      }
    },
    //点击编辑生产数量上的弹窗确定按钮
    productionEdit(){
      //插入一条产量数据（走基础的数据表）
      if (this.assProductionDoe===1){
        //组合数据
        this.assProductionFrom.editName=this.useName
        //向后端发送请求
        this.$request.post('/basisEditAddAssProduction',this.assProductionFrom).then(async result => {
          if (result.code === 401) {
            await this.$router.push('UserLogin')
            alert("您未登录，请登录")
          } else {
            this.$message('插入成功');
            this.productionEditDialog = false
            //查询新的数据
            this.assProduction = await this.paginationQueryAssProduction(this.sizeChangeProduction, this.currentChangeProduction)
          }
        })
      }
      //编辑一条产量数据（走基础的数据表）
      if (this.assProductionDoe===2){
        //组合数据
        this.assProductionFrom.editName=this.useName
        //向后端发送请求
        this.$request.post('/basisEditEditAssProduction',this.assProductionFrom).then(async result => {
          if (result.code === 401) {
            await this.$router.push('UserLogin')
            alert("您未登录，请登录")
          } else {
            this.$message('修改成功');
            this.productionEditDialog = false
            //查询新的数据
            this.assProduction = await this.paginationQueryAssProduction(this.sizeChangeProduction, this.currentChangeProduction)
          }
        })
      }
      //删除一条产量数据（走基础的数据表）
      if (this.assProductionDoe===3){
        //组合数据
        this.assProductionFrom=_.cloneDeep(this.assProductionScope.row)
        this.assProductionFrom.deleteSign=0
        this.assProductionFrom.editName=this.useName
        //向后端发送请求
        this.$request.post('/basisEditEditAssProduction',this.assProductionFrom).then(async result => {
          if (result.code === 401) {
            await this.$router.push('UserLogin')
            alert("您未登录，请登录")
          } else {
            this.$message('删除成功');
            this.productionEditDialog = false
            //查询新的数据
            this.assProduction = await this.paginationQueryAssProduction(this.sizeChangeProduction, this.currentChangeProduction)
          }
        })
      }
    },

    //辅助函数：获取当前时间，并格式化为YYYY-MM-DD时间格式
    nowDate(){
      const date = new Date();
      // 获取年份（yyyy）
      const year = date.getFullYear();

      // 获取日期（dd），并填充前导零
      const day = String(date.getDate()).padStart(2, '0');

      // 获取月份（MM），并填充前导零
      const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始，所以需要+1

      // 格式化日期为 yyyy-dd-MM
      return `${year}-${month}-${day}`;
    },
    //辅助函数：根据分页数量，以及当前是第几页，筛选出对应的发动机装机数据:
    async paginationQueryAssProduction(pageItems, pageNum) {
      //向后端发送请求，进行数据筛选，并返回给程序
      const response = await this.$request.post('paginationQueryAssProduction', {
        pageItems: pageItems,
        pageNum: pageNum
      })
      return response.data;
    },
    //用户选择的管理中台的数据中的日期变化的函数
    handleDateChange(newDate){
      this.value1=newDate
      //根据日期和班次，向后端查询数据
      this.$request.post('/towFieldQueryAssProduction',{
        oneFieldName:'dateUse',
        oneFieldVal:newDate,
        towFieldName:'classes',
        towFieldVal:this.classes
      }).then(result=>{
        if (result.data!==undefined && result.data!==[]){
          this.assProductionShow=result.data
        }
        else {
          this.assProductionShow={
            //主键
            id:'',
            //日期
            dateUse:'',
            //班次
            classes:'',
            //装配EB05生产量
            assEb05:0,
            //装配EB35生产量
            assEb35:0,
            //装配EB75生产量
            assEb75:0,
            //装配EN19生产量
            assEn19:0,
            //装配EN38生产量
            assEn38:0,
            //删除标记位
            deleteSign:'',
            //创建时间
            establishTime:'',
            //修改时间
            updateTime:'',
            //编辑人姓名
            editName:'',
          }
        }
        console.log(this.assProductionShow)
      })
    },
    //辅助函数：更新当日应该完成数量，实际完成数量的函数(没有完成，需要大修改）新的策划：对于日期是当日的，进行实际比对，对于以前的，进行数据库检验日志直接调用，type是机型，需要输入完整的机型：1000100XEB05
    async alreadyCompleted(type) {
      //查询应检数量（检测标准），是调用的所有的最新EB检测项目
      let testStandard=await this.controlTestingInquiryOneFiled('drawing',type)
      //查询已经检测完毕的数量，是调用所有的今日上传的数量
       let testNum=await this.testingQueryOneFiled('testingDate',this.nowDate())
      if (type==='1000100XEB05'){
        this.everyDayTestEB05.num=testStandard.length
        if (testNum!==undefined || testNum!=='' || testNum!=='undefined'){
          this.everyDayTestEB05.actual=0
        }
        else {
          this.everyDayTestEB05.actual=testNum.length
        }
      }
    },
    //更新综合趋势变化的函数，1.全部的PPK更新
    async comprehensive() {
      this.loading=true
      //计算PPK的，并写入数据库，用的方法是连续取点，取点完毕后，用联系25个数据计算一个值，对应日志中，日期是25组数据的最后一个数据的对应值，日记记录的就是ppk数据
      //如果一个也没有，需要从头进行计算,eb05TempPPK是一个数组，记录所有的PPK的，后端分类是按照机型计算的
      let Eb05TempPPK = await this.assTestLogInquiryByOneFiled('assTestLog',"EB05PPK")
      //以前从来没有算过,进行统计计算(是EB05的）
      if (Eb05TempPPK.length===0){
        //清空弹窗展示的数组
        this.ppkList=[]
        //清空记录的数组，准备进行后端写入
        let assTestLog=[]
        //需要一个特性一个特性的计算了，先从检测标准中，把所有EB05的项目取出来
        let eb05TestList= await this.controlTestingInquiryOneFiled('drawing','1000100XEB05')
        for (let i = 0; i < eb05TestList.length; i++) {
          //进行分别运算
          this.waitMessage='正在计算'+eb05TestList[i].op+'-'+eb05TestList[i].project
          //调取所有的该机型对应项目下的检测结果
          let edo5TestDataList=await this.controlTestingDataInquiryThreeFiled('drawing','1000100XEB05','op',eb05TestList[i].op,'project',eb05TestList[i].project)
          //判定数据是否超过25组数据,并且看循环几次
          const onc=toInteger(edo5TestDataList.length/25)
          if (onc>0){
            //表明已经够25组数据了，可以计算数据了，并且需要循环计算
            for (let j = 1; j < onc+1; j++) {
              //截取25个数据，形成一个新的数组
              const newEdo5TestDataList= edo5TestDataList.slice((j*25-25),(j*25))
              //组成计算用的数组
              let newEdo5TestDataListData=[]
              //组成25组数据的值
              let str25Val=''
              for (let k = 0; k < newEdo5TestDataList.length; k++) {
                newEdo5TestDataListData.push(newEdo5TestDataList[k].valueUse);
                // 拼接字符串，但在最后一次迭代时不添加 '|*|'
                if (k < newEdo5TestDataList.length - 1) {
                  str25Val += newEdo5TestDataList[k].valueUse + '/' + newEdo5TestDataList[k].workpiece + '|*|';
                } else {
                  // 最后一次迭代，只添加所需的部分，不添加 '|*|'
                  str25Val += newEdo5TestDataList[k].valueUse + '/' + newEdo5TestDataList[k].workpiece;
                }
              }
              //找到上公差、下公差
              const maxL=edo5TestDataList[j*25-1].standard + edo5TestDataList[j*25-1].ceiling
              const minL=edo5TestDataList[j*25-1].standard + edo5TestDataList[j*25-1].lower
              //找到这一组数据中最大的日期值
              const maxDate = newEdo5TestDataList.reduce((maxObj, currentObj) => {
                if (currentObj.testingDate > maxObj.testingDate) {
                  return currentObj;
                }
                return maxObj;
              }, newEdo5TestDataList[0]);
              //找到这一组数据中最小的日期值
              const minDate = newEdo5TestDataList.reduce((minObj, currentObj) => {
                if (currentObj.testingDate < minObj.testingDate) {
                  return currentObj;
                }
                return minObj;
              }, newEdo5TestDataList[0]);
              //计算cpk
              const cpkTemp = this.calculateCpk(newEdo5TestDataListData,maxL,minL).toFixed(2)
              //组合PPK计算结果的值
              let ppkListItem={
                //过程分割符|%|，25组数据分割符用|*|，特性名称语言分割符用|*|
                //主键
                id: null,
                //机型代码
                drawing:maxDate.drawing,
                //工序代码
                op:maxDate.op,
                //特性名称(中文）
                project:maxDate.project,
                //特性名称(英文）
                projectEnglish:maxDate.projectEnglish,
                //特性名称(俄文）
                projectRussian:maxDate.projectRussian,
                //计算起始日期
                startDate:minDate.testingDate,
                //计算终止日期
                endDate:maxDate.testingDate,
                //计算值
                ppk:cpkTemp,
                //25组数据值
                valueUse:str25Val,
                //标准值
                standard:maxDate.standard,
                //上公差值
                ceiling:maxDate.ceiling,
                //下公差值
                lower:maxDate.lower,
                //编辑人
                editName:this.useName,
                //编辑时间
                editDate:this.nowDate(),
              }
              this.ppkList.push(ppkListItem)
              //组合字符串
              const str = Object.keys(ppkListItem).reduce((acc, key) => {
                return acc + (acc ? '|%|' : '') + ppkListItem[key];
              }, '')
              //组合要向后端插入的数组
              let assTestLogItem={
                      //主键
                      id:0,
                      //日期
                      dateUse:ppkListItem.endDate,
                      //记录类型（都是用的中文）  类型有：1：当日应检测数量；2：EB05PPK
                      assTestLog:'EB05PPK',
                      //记录信息
                      messageLog:str,
                      //删除标记位
                      deleteSign:1,
                      //编辑人姓名
                      editName:this.useName,
                    }
              //组合数组
              assTestLog.push(assTestLogItem)
            }
          }
        }
        this.assTestLogInsertAll(assTestLog)
        this.loading=false
      }
    },
    //按照月计算PPK
    async ppkMonthCount() {
      //确认本月是否已经计算，按照月度计算的标记案例是：EB05PPK-YYYY-MM-DD；
      //看看是不是到了日期，如果没有到日期，将提示用户，本月暂不能计算
      const day1 = parseInt(this.nowDate().split('-')[2], 10);
      if (day1<21){
        alert("现在未到本月21日，暂无法计算")
      }
      else {
        //验证EB05的数据，看以前是不是已经计算过了
        //生成项目标记，作为向后端查询的输入
        let ingLogTemp=this.nowDate().split('-')
        //查询是不是已经计算过了
        const ingLogVal='EB05PPK'+'-M-'+ingLogTemp[0]+'-'+ingLogTemp[1]+'-20'
        //去数据库中查找内容，看看是不是本月已计算。
        const itemMonthResult=await this.assTestLogEndDateCount('assTestLog',ingLogVal,'dateUse')
        if (itemMonthResult===undefined || itemMonthResult==='undefined' || itemMonthResult===''){
          //向后端请求数据，并计算，要计算的是所有的特性
          this.loading=true
          //清空记录的数组，准备进行后端写入
          let assTestLog=[]
          //定义查询日期(起始日期）
          let startDate=''
          if (ingLogTemp[1]==='01'){
            let yearNum = parseInt(ingLogTemp[0], 10)-1;
            startDate=toString(yearNum)+'-12'+'-20'
          }
          else {
            let monthNum=parseInt(ingLogTemp[1], 10)-1;
            startDate=ingLogTemp[0]+'-'+monthNum.toString().padStart(2, '0')+'-20'
          }
          //定义查询日期（终止日期）
          let endDate=ingLogTemp[0]+'-'+ingLogTemp[1]+'-'+'20'
          //需要一个特性一个特性的计算了，先从检测标准中，把所有EB05的项目取出来
          let eb05TestList= await this.controlTestingInquiryOneFiled('drawing','1000100XEB05')
          for (let i = 0; i < eb05TestList.length; i++) {
            //进行分别运算
            this.waitMessage='正在计算'+eb05TestList[i].op+'-'+eb05TestList[i].project
            //调取所有的该机型对应项目下的检测结果，需要按照月度检测结果调取，如果不足25组的，要调取前面的，够25组数据，进行计算；
            let edo5TestDataList=await this.testingQueryOneFieldByAtoB('testingDate',startDate,endDate,'project',eb05TestList[i].project)
            if (edo5TestDataList.length<25){
              edo5TestDataList=await this.testingQueryFieldAndBNum('project',eb05TestList[i].project,'testingDate',25,endDate)
              if (edo5TestDataList.length>=25){
                //开始计算PPK
                //组成计算用的数组
                let newEdo5TestDataListData=[]
                //组成25组数据的值
                let str25Val=''
                for (let k = 0; k < edo5TestDataList.length; k++) {
                  newEdo5TestDataListData.push(edo5TestDataList[k].valueUse);
                  // 拼接字符串，但在最后一次迭代时不添加 '|*|'
                  if (k < edo5TestDataList.length - 1) {
                    str25Val += edo5TestDataList[k].valueUse + '/' + edo5TestDataList[k].workpiece + '|*|';
                  } else {
                    // 最后一次迭代，只添加所需的部分，不添加 '|*|'
                    str25Val += edo5TestDataList[k].valueUse + '/' + edo5TestDataList[k].workpiece;
                  }
                }
                //找到上公差、下公差
                const maxL=edo5TestDataList[0].standard + edo5TestDataList[0].ceiling
                const minL=edo5TestDataList[0].standard + edo5TestDataList[0].lower
                //找到这一组数据中最大的日期值
                const maxDate = edo5TestDataList.reduce((maxObj, currentObj) => {
                  if (currentObj.testingDate > maxObj.testingDate) {
                    return currentObj;
                  }
                  return maxObj;
                }, edo5TestDataList[0]);
                //找到这一组数据中最小的日期值
                const minDate = edo5TestDataList.reduce((minObj, currentObj) => {
                  if (currentObj.testingDate < minObj.testingDate) {
                    return currentObj;
                  }
                  return minObj;
                }, edo5TestDataList[0]);
                //计算cpk
                const cpkTemp = this.calculateCpk(newEdo5TestDataListData,maxL,minL).toFixed(2)
                //组合PPK计算结果的值
                let ppkListItem={
                  //过程分割符|%|，25组数据分割符用|*|，特性名称语言分割符用|*|
                  //主键
                  id: null,
                  //机型代码
                  drawing:maxDate.drawing,
                  //工序代码
                  op:maxDate.op,
                  //特性名称(中文）
                  project:maxDate.project,
                  //特性名称(英文）
                  projectEnglish:maxDate.projectEnglish,
                  //特性名称(俄文）
                  projectRussian:maxDate.projectRussian,
                  //计算起始日期
                  startDate:minDate.testingDate,
                  //计算终止日期
                  endDate:maxDate.testingDate,
                  //计算值
                  ppk:cpkTemp,
                  //25组数据值
                  valueUse:str25Val,
                  //标准值
                  standard:maxDate.standard,
                  //上公差值
                  ceiling:maxDate.ceiling,
                  //下公差值
                  lower:maxDate.lower,
                  //编辑人
                  editName:this.useName,
                  //编辑时间
                  editDate:this.nowDate(),
                }
                this.ppkList.push(ppkListItem)
                //组合字符串
                const str = Object.keys(ppkListItem).reduce((acc, key) => {
                  return acc + (acc ? '|%|' : '') + ppkListItem[key];
                }, '')
                //组合要向后端插入的数组
                let assTestLogItem={
                  //主键
                  id:0,
                  //日期
                  dateUse:ppkListItem.endDate,
                  //记录类型（都是用的中文）  类型有：1：当日应检测数量；2：EB05PPK
                  assTestLog:'EB05PPK'+'-M'+'-'+endDate,
                  //记录信息
                  messageLog:str,
                  //删除标记位
                  deleteSign:1,
                  //编辑人姓名
                  editName:this.useName,
                }
                //组合数组
                assTestLog.push(assTestLogItem)
              }
              else {
                //组合PPK计算结果的值,需要组合成数据不足
                let ppkListItem={
                  //过程分割符|%|，25组数据分割符用|*|，特性名称语言分割符用|*|
                  //主键
                  id: null,
                  //机型代码
                  drawing:eb05TestList[i].drawing,
                  //工序代码
                  op:eb05TestList[i].op,
                  //特性名称(中文）
                  project:eb05TestList[i].project,
                  //特性名称(英文）
                  projectEnglish:eb05TestList[i].projectEnglish,
                  //特性名称(俄文）
                  projectRussian:eb05TestList[i].projectRussian,
                  //计算起始日期
                  startDate:'',
                  //计算终止日期
                  endDate:'',
                  //计算值
                  ppk:'数据不足',
                  //25组数据值
                  valueUse:'',
                  //标准值
                  standard:'',
                  //上公差值
                  ceiling:'',
                  //下公差值
                  lower:'',
                  //编辑人
                  editName:this.useName,
                  //编辑时间
                  editDate:this.nowDate(),
                }
                this.ppkList.push(ppkListItem)
                //组合字符串
                const str = Object.keys(ppkListItem).reduce((acc, key) => {
                  return acc + (acc ? '|%|' : '') + ppkListItem[key];
                }, '')
                //组合要向后端插入的数组
                let assTestLogItem={
                  //主键
                  id:0,
                  //日期
                  dateUse:ppkListItem.endDate,
                  //记录类型（都是用的中文）  类型有：1：当日应检测数量；2：EB05PPK
                  assTestLog:'EB05PPK'+'-M'+'-'+endDate,
                  //记录信息
                  messageLog:str,
                  //删除标记位
                  deleteSign:1,
                  //编辑人姓名
                  editName:this.useName,
                }
                //组合数组
                assTestLog.push(assTestLogItem)
              }
            }
            else {
              //开始计算PPK

              //组成计算用的数组
              let newEdo5TestDataListData=[]
              //组成25组数据的值
              let str25Val=''
              for (let k = 0; k < edo5TestDataList.length; k++) {
                newEdo5TestDataListData.push(edo5TestDataList[k].valueUse);
                // 拼接字符串，但在最后一次迭代时不添加 '|*|'
                if (k < edo5TestDataList.length - 1) {
                  str25Val += edo5TestDataList[k].valueUse + '/' + edo5TestDataList[k].workpiece + '|*|';
                } else {
                  // 最后一次迭代，只添加所需的部分，不添加 '|*|'
                  str25Val += edo5TestDataList[k].valueUse + '/' + edo5TestDataList[k].workpiece;
                }
              }
              //找到上公差、下公差
              const maxL=edo5TestDataList[0].standard + edo5TestDataList[0].ceiling
              const minL=edo5TestDataList[0].standard + edo5TestDataList[0].lower
              //找到这一组数据中最大的日期值
              const maxDate = edo5TestDataList.reduce((maxObj, currentObj) => {
                if (currentObj.testingDate > maxObj.testingDate) {
                  return currentObj;
                }
                return maxObj;
              }, edo5TestDataList[0]);
              //找到这一组数据中最小的日期值
              const minDate = edo5TestDataList.reduce((minObj, currentObj) => {
                if (currentObj.testingDate < minObj.testingDate) {
                  return currentObj;
                }
                return minObj;
              }, edo5TestDataList[0]);
              //计算cpk
              const cpkTemp = this.calculateCpk(newEdo5TestDataListData,maxL,minL).toFixed(2)
              //组合PPK计算结果的值
              let ppkListItem={
                //过程分割符|%|，25组数据分割符用|*|，特性名称语言分割符用|*|
                //主键
                id: null,
                //机型代码
                drawing:maxDate.drawing,
                //工序代码
                op:maxDate.op,
                //特性名称(中文）
                project:maxDate.project,
                //特性名称(英文）
                projectEnglish:maxDate.projectEnglish,
                //特性名称(俄文）
                projectRussian:maxDate.projectRussian,
                //计算起始日期
                startDate:minDate.testingDate,
                //计算终止日期
                endDate:maxDate.testingDate,
                //计算值
                ppk:cpkTemp,
                //25组数据值
                valueUse:str25Val,
                //标准值
                standard:maxDate.standard,
                //上公差值
                ceiling:maxDate.ceiling,
                //下公差值
                lower:maxDate.lower,
                //编辑人
                editName:this.useName,
                //编辑时间
                editDate:this.nowDate(),
              }
              this.ppkList.push(ppkListItem)
              //组合字符串
              const str = Object.keys(ppkListItem).reduce((acc, key) => {
                return acc + (acc ? '|%|' : '') + ppkListItem[key];
              }, '')
              //组合要向后端插入的数组
              let assTestLogItem={
                //主键
                id:0,
                //日期
                dateUse:ppkListItem.endDate,
                //记录类型（都是用的中文）  类型有：1：当日应检测数量；2：EB05PPK
                assTestLog:'EB05PPK'+'-M'+'-'+endDate,
                //记录信息
                messageLog:str,
                //删除标记位
                deleteSign:1,
                //编辑人姓名
                editName:this.useName,
              }
              //组合数组
              assTestLog.push(assTestLogItem)
            }
          }
          //向后端写入数据
          this.assTestLogInsertAll(assTestLog)
          //关闭忙标识
          this.loading=false
        }
        else {
          alert("本月已计算，需要重新计算请联系管理员")
        }
      }
    },
    //查看检测日志记录的信息
    async comprehensiveShow(doe) {
      this.ppkList=[]
      this.trendDialog = true
      if (doe===1){
        let ppkListTemp = await this.assTestLogInquiryByOneFiled('assTestLog', 'EB05PPK')
        for (let i = 0; i < ppkListTemp.length; i++) {
          let temp=ppkListTemp[i].messageLog.split('|%|')
          let ppkListItem={
            //过程分割符|%|，25组数据分割符用|*|，特性名称语言分割符用|*|
            //主键
            id: i,
            //机型代码
            drawing:temp[1],
            //工序代码
            op:temp[2],
            //特性名称(中文）
            project:temp[3],
            //特性名称(英文）
            projectEnglish:temp[4],
            //特性名称(俄文）
            projectRussian:temp[5],
            //计算起始日期
            startDate:temp[6],
            //计算终止日期
            endDate:temp[7],
            //计算值
            ppk:temp[8],
            //25组数据值
            valueUse:temp[9],
            //标准值
            standard:temp[10],
            //上公差值
            ceiling:temp[11],
            //下公差值
            lower:temp[12],
            //编辑人
            editName:temp[13],
            //编辑时间
            editDate:temp[14],
          }
          this.ppkList.push(ppkListItem)
        }
      }
      //是EB不合格的明细
      else if (doe===2){
        this.titleUse="EB05PPK不达标项目"
        this.ppkList=_.cloneDeep(this.ppkListMEB05NG)
      }
    },
    //辅助函数：（检测日志）向装配检测日志的数据库中查询，根据一个字段，查询所有
    async assTestLogInquiryByOneFiled(oneFiledName, oneFiledVal) {
      //向后端查询信息
      const response = await this.$request.post('/assTestLogInquiryByOneFiled', {
        oneFiledName: oneFiledName,
        oneFiledVal: oneFiledVal,
      })
      return response.data
    },
    //辅助函数：（检测日志）向装配检测日志的数据库中查询，根据两个字段，查询所有
    async assTestLogInquiryByTowFiled(oneFiledName, oneFiledVal, towFiledNane, towFiledVal) {
      //向后端查询信息
      const response = await this.$request.post('/assTestLogInquiryByTowFiled', {
        oneFiledName: oneFiledName,
        oneFiledVal: oneFiledVal,
        towFiledNane: towFiledNane,
        towFiledVal: towFiledVal,
      })
      return response.data
    },
    //辅助函数：（检测日志）根据一个字段，按照另一个字段从大到小排序，查询出第一条（主要用在了查询最后计算日期的场景上）
    async assTestLogEndDateCount(oneFieldName,oneFieldVal, towFieldName) {
      let response = await this.$request.post('/assTestLogEndDateCount',{
        oneFiledName:oneFieldName,
        oneFieldVal:oneFieldVal,
        towFieldName:towFieldName,
      })
      return response.data
    },
    //辅助函数，(检测日志）向装配检测日志的数据库中一次插入多个数据
    assTestLogInsertAll(assTestLog){
      //向后端写入数据
      this.$request.post('/assTestLogInsertAll',assTestLog).then(result=>{
        this.$message(result.data)
      })
    },
    //辅助函数：（检测标准）根据机型名称，向后端查询需要检测的数量：根据机型号，filedName：查询的机型名称,（查询的是检测基准）
    async queryNumControlTexting(fieldName) {
      try {
        const response = await this.$request.post('queryNumControlTexting', fieldName);
        // 假设后端返回的数据在 response.data 中
        return response.data;
      } catch (error) {
        console.error('Error fetching data:', error);
        return null;
      }
    },
    //辅助函数：（检测标准）根据一个字段，查询出符合这个字段所有的数据
    async controlTestingInquiryOneFiled(oneFiledName, oneFiledVal) {
      //向后端查询信息
      const response = await this.$request.post('/controlTestingInquiryOneFiled', {
        oneFiledName: oneFiledName,
        oneFiledVal: oneFiledVal,
      })
      return response.data
    },
    //辅助函数：（检测数据）根据一个字段，查询符合等于这个字段的数据条数（查的是检测数据）
    async queryNumTextingResult(fieldName,fieldVal){
      try {
        const response = await this.$request.post('queryNumTextingResult', {
          fieldName:fieldName,
          fieldVal:fieldVal
        });
        // 假设后端返回的数据在 response.data 中
        return response.data;

      } catch (error) {
        console.error('Error fetching data:', error);
        return null;
      }
    },
    //辅助函数：（检测数据）根据一个字段，查询等于这个字段的所有数据
    async testingQueryOneFiled(fieldName,fieldVal){
      try {
        const response = await this.$request.post('testingQueryOneFiled', {
          fieldName:fieldName,
          fieldVal:fieldVal
        });
        // 假设后端返回的数据在 response.data 中
        return response.data;

      } catch (error) {
        console.error('Error fetching data:', error);
        return null;
      }
    },
    //辅助函数：（检测数据）根据一个字段，查询这个字段下A值到B值的数据，主要用在查询两个日期之间的值，或者大于A，小于等于B的值；
    async testingQueryOneFieldByAtoB(fieldName,fieldValA,fieldValB,towFieldName,towFieldVal){
      try {
        const response = await this.$request.post('testingQueryOneFieldByAtoB', {
          fieldName:fieldName,
          fieldValA:fieldValA,
          fieldValB:fieldValB,
          towFieldName:towFieldName,
          towFieldVal:towFieldVal
        });
        // 假设后端返回的数据在 response.data 中
        return response.data;

      } catch (error) {
        console.error('Error fetching data:', error);
        return null;
      }
    },
    //辅助函数：（检测数据）根据一个字段A等于某一值，B字段从大到小排序，筛选n行；startData是筛选的起始日期
    async testingQueryFieldAndBNum(fieldNameA,fieldValA,fieldNameB,n,startData){
      try {
        const response = await this.$request.post('testingQueryFieldAndBNum', {
          fieldNameA:fieldNameA,
          fieldValA:fieldValA,
          fieldNameB:fieldNameB,
          n:n,
          startData:startData
        });
        // 假设后端返回的数据在 response.data 中
        return response.data;

      } catch (error) {
        console.error('Error fetching data:', error);
        return null;
      }
    },
    //辅助函数：（检测结果）根据三个字段，询符合等于这三个字段的数据
    async controlTestingDataInquiryThreeFiled(oneFiledName, oneFiledVal, towFiledNane, towFiledVal, threeFiledName, threeFiledVal) {
      //向后端查询信息
      const response = await this.$request.post('/controlTestingDataInquiryThreeFiled', {
        oneFiledName: oneFiledName,
        oneFiledVal: oneFiledVal,
        towFiledNane: towFiledNane,
        towFiledVal: towFiledVal,
        threeFiledName:threeFiledName,
        threeFiledVal:threeFiledVal
      })
      return response.data
    },
    //辅助函数：调取最近月份的月度PPK计算结果：type：代表是要查询哪个机型的，EB05、EN19等，需要输入的是前半部分的记录：例如EB05PPK
    async queryLatelyMonth(type) {
      let assTestLog = []//记录筛选出来符合条件的检测日志
      //形成最近一个月的数据，先形成最近月的字符串，然后逐个进行筛选，直到有数据后执行下一步
      //定义查询日期(起始日期）
      let ingLogTemp = this.nowDate().split('-')
      let startDate = ingLogTemp[0] + '-' + ingLogTemp[1] + '-' + '20'
      //向后端查询，确认本月的是不是有
      assTestLog = await this.assTestLogInquiryByOneFiled('assTestLog',type+'-M-'+startDate)
      //如果筛选没有，向下一个月进行筛选，如果下一个月也没有，就提示用户，需要计算PPK了。
      if (assTestLog.length>0){
        //有，进入分割程序，由辅助函数完成；

      }
    },
    //辅助函数：把检测日志中的数据转换为PPK的值，给的是一个数组，返回的也是一个数组
    assTestLogByPPK(assTestLog){
      let ppkList=[]
      for (let i = 0; i < assTestLog.length; i++) {
        let temp=assTestLog[i].messageLog.split('|%|')
        let ppkListItem={
          //过程分割符|%|，25组数据分割符用|*|，特性名称语言分割符用|*|
          //主键
          id: i,
          //机型代码
          drawing:temp[1],
          //工序代码
          op:temp[2],
          //特性名称(中文）
          project:temp[3],
          //特性名称(英文）
          projectEnglish:temp[4],
          //特性名称(俄文）
          projectRussian:temp[5],
          //计算起始日期
          startDate:temp[6],
          //计算终止日期
          endDate:temp[7],
          //计算值
          ppk:temp[8],
          //25组数据值
          valueUse:temp[9],
          //标准值
          standard:temp[10],
          //上公差值
          ceiling:temp[11],
          //下公差值
          lower:temp[12],
          //编辑人
          editName:temp[13],
          //编辑时间
          editDate:temp[14],
        }
        ppkList.push(ppkListItem)
      }
      return ppkList
    },
    //(检测日志)根据用户点击的刷新按钮，更新最新的计算日期：type是类型，例如：EB05PPK，或者其他的类型数据，doe:是检测类型中的第二位，例如，EB05PPK，M，就是代表要查询月度EB05PPK的值，也就是模糊查询EB05PPK-M，排序是dateUse列创建时间倒序排序；
    async assTestLogRefreshPPKDate(type, doe) {
      //组合要查询的字符串
      let temp = type + '-' + doe
      //向后端发送请求，进行模糊查询
      //向后端查询信息
      const response = await this.$request.post('/assTestLogRefreshPPKDate', {
        FiledVal:temp
      })
      if (type==='EB05PPK'){
        this.EB05PPKDateM=response.data.assTestLog.slice(-10)
        //向后端查询最近月份的明细,用的是已经查出来的年月日
        let oneFiledVal=type+'-M-'+this.EB05PPKDateM
        let assTestLog=await this.assTestLogInquiryByOneFiled('assTestLog',oneFiledVal)
        //分割为对应的PPK结构的数组
        this.ppkListMEB05=this.assTestLogByPPK(assTestLog)
        console.log(this.ppkListMEB05)
        //计算不合格的数量
         this.EB05PPKDate133=0
        // 初始化计数器
         let countBelow133 = 0
        //初始化记录数组
        this.ppkListMEB05NG=[]
        let ppkListMEB05NG=[]
        this.ppkListMEB05OK=[]
        let ppkListMEB05OK=[]
        // 遍历数组
        this.ppkListMEB05.forEach(function(item) {
          // 尝试将 ppk 转换为数字
          let ppkValue = Number(item.ppk);
          console.log(ppkValue)
          // 检查转换后的值是否是数字且小于1.33
          if (!isNaN(ppkValue) && ppkValue < 1.33) {
            // 如果是，则增加计数器
            countBelow133=countBelow133+1
            ppkListMEB05NG.push(item)
          }
          else {
            ppkListMEB05OK.push(item)
          }
        });
        // 输出结果
        this.EB05PPKDate133=countBelow133
        this.ppkListMEB05NG=ppkListMEB05NG
        this.ppkListMEB05OK=ppkListMEB05OK
      }
    }
},
  mounted() {
    //调用用户权限
    this.inquiry()
    //数据清除
    this.workBook=[]
    // this.queryLatelyMonth('EB05PPK')
  },
  beforeDestroy() {
    if (this.chartUser) {
      this.chartUser.dispose()
    }
    if (this.chartUserBor){
      this.chartUserBor.dispose()
    }
    if (this.chartUserLien){
      this.chartUserLien.dispose()
    }
  }
}
</script>

<style scoped>
/* 主体左侧的工作步骤栏用到的数据包围的div的样式*/

.el-footer {
  background-color: #ffffff;
  color: #333;
  text-align: center;
  border-width: 3px; /* 设置边框宽度为3像素 */
  border-color: blue; /* 设置边框颜色为蓝色 */
  border-style: solid; /* 设置边框样式为实线 */
  padding: 10px; /* 添加内边距 */
  border-left-color: white;
  border-top: white;
}

.el-aside {
  background-color: #ffffff;
  color: #333;
  text-align: center;
  border-width: 3px; /* 设置边框宽度为3像素 */
  border-color: blue; /* 设置边框颜色为蓝色 */
  border-style: solid; /* 设置边框样式为实线 */
  padding: 10px; /* 添加内边距 */
  height: 89vh;
}

.el-main {
  color: #333;
  text-align: center;
  border-width: 3px; /* 设置边框宽度为3像素 */
  border-color: blue; /* 设置边框颜色为蓝色 */
  border-left-color: white;
  border-style: solid; /* 设置边框样式为实线 */
  padding: 10px; /* 添加内边距 */
}


body > .el-container {
  margin-bottom: 40px;
}

.el-container:nth-child(5) .el-aside,
.el-container:nth-child(6) .el-aside {
  line-height: 260px;
}

.el-container:nth-child(7) .el-aside {
  line-height: 320px;
}

.item {
  flex: 1; /* 每个元素占据相等的空间 */
  /* 其他样式，如边框、背景色等 */
  box-sizing: border-box; /* 包括边框和内边距在计算宽度时 */
  margin: 10px;
  width: 100%;
}

.container {
  display: flex;
  justify-content: space-between; /* 让子元素分散在容器的两侧 */
  align-items: center; /* 垂直方向上居中对齐子元素 */
}

.UploadS{
  border-width: 1px; /* 设置边框宽度为3像素 */
  border-color: blue; /* 设置边框颜色为蓝色 */
  border-style: solid; /* 设置边框样式为虚线 */
  padding: 10px; /* 添加内边距 */
}
.UploadS1 {
  border-width: 1px; /* 设置边框宽度为3像素 */
  border-color: blue; /* 设置边框颜色为蓝色 */
  border-style: solid; /* 设置边框样式为虚线 */
  padding: 5px; /* 添加内边距 */
  margin: 5px;/* 添加内边距 */
  display: flex; /* 设置为 Flex 容器 */
  flex-direction: row; /* 子元素水平排列（默认就是这样） */
  justify-content: space-between; /* 两端对齐，如果需要平均分布使用space-around或space-evenly */
  height: 33vh;
}
.UploadS2 {
  border-width: 1px; /* 设置边框宽度为3像素 */
  border-color: blue; /* 设置边框颜色为蓝色 */
  border-style: solid; /* 设置边框样式为虚线 */
  padding: 5px; /* 添加内边距 */
  margin: 5px;/* 添加内边距 */
//display: flex; /* 启用Flexbox */
  justify-content: space-between; /* 两端对齐，如果需要平均分布使用space-around或space-evenly */
  height: 29vh;
  width: 55%;
}
.UploadS2-1 {
  border-width: 1px; /* 设置边框宽度为3像素 */
  border-color: red; /* 设置边框颜色为蓝色 */
  border-style: solid; /* 设置边框样式为虚线 */
  padding: 5px; /* 添加内边距 */
  margin: 5px;/* 添加内边距 */
//display: flex; /* 启用Flexbox */
  justify-content: space-between; /* 两端对齐，如果需要平均分布使用space-around或space-evenly */
  height: 29vh;
  width: 450px;
}
.UploadS2-2 {
  border-width: 1px; /* 设置边框宽度为3像素 */
  border-color: red; /* 设置边框颜色为蓝色 */
  border-style: solid; /* 设置边框样式为虚线 */
  padding: 5px; /* 添加内边距 */
  margin: 5px;/* 添加内边距 */
//display: flex; /* 启用Flexbox */
  justify-content: space-between; /* 两端对齐，如果需要平均分布使用space-around或space-evenly */
  height: 29vh;
  width: 350px;
  overflow-y: auto;
}
.UploadContainer {
  display: flex;
  flex-direction: column; /* 设置为列方向 */
  width: 100%;
}
.UploadRow {
  display: flex;
  justify-content: space-between; /* 两端对齐，使子元素左右平分 */
  margin-top: 3px; /* 添加上外边距，与第一个元素区分 */
}
.button{
  width: 160px;
}
.UploadS3 {
  flex: 1; /* 每个子元素占据可用空间的相等部分 */
  /* 或者，如果你想要明确设置宽度为 50% */
   height: 100%;
  box-sizing: border-box; /* 确保边框和内边距包含在元素的宽度内 */
  /* 其他样式 ... */
}

.headMain{
  color: #ffffff; /* 设置字体颜色为红色 */
  font-size: 18px;
}
.center-text {
  /* 使用 margin-left 和 margin-right auto 来实现居中效果 */
  margin-left: auto;
  margin-right: auto;
  /* 注意：如果 header 内只有这两个元素，你可能不需要 margin-right: auto */
}

.LineDiv{
  width:75vw;
  height: 34vh;
  margin-left: 0;
}

</style>